1

在 linux 中写入文件/proc或文件系统的正确方法是什么?/sysc

我可以像在任何其他文件中那样写,还是我必须注意一些特殊的注意事项?

例如,我想模仿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);
}
4

1 回答 1

3

您的方法在写操作中缺少一些错误处理。

fprintf(或,或您喜欢使用的fwrite任何内容)可能会失败,例如,如果 sysfs 文件后面的内核驱动程序不喜欢您正在编写的内容。例如:

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

为了捕捉这些错误,您必须fprintf检查ferror(). 例如,如果您正在编写“mem”,fprintf则应返回 3,并且流中不应设置任何错误。

但是还缺少一件事:sysfs 不是标准文件。为了正确返回先前的写入错误,您必须禁用流中的缓冲,否则fprintf(or fwrite)) 可能会愉快地结束而没有任何错误。你可以setvbuffopen.

setvbuf (f, NULL, _IONBF, 0);
于 2021-02-05T12:09:36.943 回答