【问题标题】:proper way of writing to /sys or /proc filesystem in c在 c 中写入 /sys 或 /proc 文件系统的正确方法
【发布时间】:2020-11-22 15:04:25
【问题描述】:

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

【问题讨论】:

  • 您的代码对我来说看起来不错。你试过了吗?
  • echo 不知道它正在写信给sys,你的程序为什么要写?
  • @n。 '代词' m - 就 echo 而言,它认为它正在写入终端。重定向由 shell 处理。而且我不知道shell是否对/sys有一些特殊处理。毕竟,sys 和 proc 在很多方面确实表现不同。
  • 它写入标准输出。 Shell 对/proc/sys 也一无所知。
  • /proc/ 和 /sys 中的文件是 files 是有充分理由的。原因是能够使用处理文件的现有工具访问它们。如果它们需要特殊处理,那么通过类似文件但不完全的接口使它们可用是绝对零意义的。

标签: c procfs sysfs write


【解决方案1】:

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

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

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

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

但还缺少一件事:sysfs 不是标准文件。为了正确返回先前的写入错误,您必须禁用流中的缓冲,否则fprintf(或fwrite))可能会愉快地结束而没有任何错误。您可以在 fopen 之后使用 setvbuf 执行此操作。

setvbuf (f, NULL, _IONBF, 0);

【讨论】:

    猜你喜欢
    • 2020-12-23
    • 2021-10-18
    • 1970-01-01
    • 2010-11-09
    • 1970-01-01
    • 2011-09-03
    • 1970-01-01
    • 1970-01-01
    • 2019-04-07
    相关资源
    最近更新 更多