правильный способ записи в файловую систему /sys или /proc в c

как правильно записать в файловую систему /proc или /sys в linux в c?

Могу ли я писать так же, как в любом другом файле, или есть особые соображения, о которых я должен знать?

Например, я хочу эмулировать echo -n mem > /sys/power/state. Будет ли следующий код правильным способом сделать это?

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv) {

    FILE *f;

    f = fopen("/sys/power/state", "w");

    if(f == NULL) {
        printf("Error opening file: /sys/power/state\n");   
        exit(1);             
    }

    fprintf(f,"%s","mem");

    fclose(f);
}

person 400 the Cat    schedule 02.08.2020    source источник
comment
Ваш код выглядит хорошо для меня. Ты это пробовал?   -  person John Zwinck    schedule 02.08.2020
comment
echo не знает, что пишет в sys, почему ваша программа должна?   -  person n. 1.8e9-where's-my-share m.    schedule 02.08.2020
comment
@н. 'местоимения' m - что касается эха, оно думает, что пишет на терминал. Перенаправление обрабатывается оболочкой. И я не знаю, есть ли в оболочке какие-то специальные обработки для /sys. В конце концов, sys и proc во многом ведут себя по-разному.   -  person 400 the Cat    schedule 02.08.2020
comment
Он пишет на стандартный вывод. Shell также ничего не знает о /proc или /sys.   -  person n. 1.8e9-where's-my-share m.    schedule 02.08.2020
comment
Файлы в /proc/ и /sys являются файлами по уважительной причине. Причина в возможности доступа к ним с помощью существующих инструментов, обрабатывающих файлы. Если бы они нуждались в специальной обработке, не было бы абсолютно никакого смысла делать их доступными через интерфейс, похожий на файл, но не совсем.   -  person n. 1.8e9-where's-my-share m.    schedule 02.08.2020
comment
Не должно быть никакой разницы в чтении или записи из /proc или /sys в C. В зависимости от того, что вы хотите сделать, вы также можете создать запись proc, посмотрите здесь пример linux.die.net/lkmpg/x769.html . В вашем примере я вижу, что вы открываете файл и закрываете его, но не читаете и не пишете в него. Вы пробовали?   -  person Bhaskar Tallamraju    schedule 02.08.2020
comment
@н. 'местоимения' м. - это не может быть правдой. Файлы в proc и sys ведут себя по-разному. Например, они показывают размер файла 0 байт, даже если он не пуст.   -  person 400 the Cat    schedule 02.08.2020
comment
Также трудно перемещать файлы в /proc или /sys.   -  person stark    schedule 02.08.2020
comment
Эти файлы являются динамическими. Учтите, что они постоянно обновляются ядром за вашей спиной. Поддержание правильного размера для них просто невозможно. Почему это проблема?   -  person n. 1.8e9-where's-my-share m.    schedule 02.08.2020
comment
@stark Файловая система не должна поддерживать такие операции, как перемещение или удаление.   -  person n. 1.8e9-where's-my-share m.    schedule 02.08.2020


Ответы (1)


В вашем подходе отсутствует обработка ошибок в операции записи.

fprintf (или fwrite, или что вы предпочитаете использовать) может выйти из строя, например. если драйверу ядра, стоящему за файлом sysfs, не нравится то, что вы пишете. Например.:

echo 17 > /sys/class/gpio/export
-bash: echo: write error: Invalid argument

Чтобы поймать эти ошибки, вы ДОЛЖНЫ проверить вывод fprintf, чтобы увидеть, все ли символы, которые вы ожидали записать, были записаны, и вы также должны проверить вывод ferror(). Например. если вы пишете mem, fprintf должно возвращать 3 и в потоке не должно быть никаких ошибок.

Но отсутствует еще одна вещь: sysfs не являются стандартными файлами. Чтобы предыдущая ошибка записи возвращалась правильно, вы ДОЛЖНЫ отключить буферизацию в своем потоке, иначе fprintf (или fwrite)) может благополучно завершиться без какой-либо ошибки. Вы можете сделать это с помощью setvbuf сразу после fopen.

setvbuf (f, NULL, _IONBF, 0);
person Aleksander    schedule 05.02.2021