在 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);
在 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);