在 c 中写入 /sys 或 /proc 文件系统的正确方法

proper way of writing to /sys or /proc filesystem in c

c 中 linux 中写入 /proc/sys 文件系统的正确方法是什么?

我可以像在任何其他文件中那样写吗,或者有什么我必须注意的特殊注意事项吗?

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

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

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

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

为了捕获这些错误,您必须检查 fprintf 的输出以查看是否写入了您希望写入的所有字符,并且您还应该检查 ferror() 的输出.例如。如果你正在写“mem”,fprintf 应该 return 3 并且流中不应该有任何错误设置。

但还缺少一件事:sysfs 不是标准文件。要正确地 return 编辑先前的写入错误,您必须禁用流中的缓冲,否则 fprintf(或 fwrite))可能会愉快地结束而不会出现任何错误。您可以在 fopen.

之后使用 setvbuf 这样做
setvbuf (f, NULL, _IONBF, 0);