无法通过 system() 从程序中使用 "echo" 设置文件

Can't set file with "echo" from a program via system()

我正在尝试使用 system("echo 1 > /sys/class/afile") 将文件设置为 1。

如果我在控制台上使用它,它运行良好,但如果我 运行 我的 C 程序,它会显示:

sh: echo: I/O error

我已经尝试使用以下代码进行设置:

char i[1];
i[0]=1;
int fd1 = open("/sys/class/afile",O_CREAT | O_WRONLY);
int ret = write(fd1,i,strlen(i));
if(ret > 0)
   printf("Ok\n");
else
   printf("nOk\n");
close(fd1);

结果是 "Ok" 但文件没有改变。

strlen(i) 产生未定义的行为,因为 i 不是字符串;该阵列缺少空终止空间。此外,i[0]=1; 并没有在数组中放入一个 '1' 字符,而是放入一个值为 1 的字节,这是一个“^A 字符”。

改为尝试 write(fd, "1", 1) - 不需要任何变量或 strlen.

这里

int fd1 = open("/sys/class/afile",O_CREAT | O_WRONLY);

你需要在 open() 的第三个参数中提供 mode 因为你正在使用 O_CREAT

来自 open

的手册页

int open(const char *pathname, int flags, mode_t mode);

它说

O_CREAT

If pathname does not exist, create it as a regular file.

The mode argument specifies the file mode bits be applied when a new file is created. This argument must be supplied when **O_CREAT or O_TMPFILE is specified in flags;**

例如你可以试试这个

int fd1 = open("/sys/class/afile",O_CREAT | O_WRONLY, 0664);

并使用 perror() 检查 return 系统调用的 open() 值。

也在这里

char i[1];
int ret = write(fd1,i,strlen(i));

正如@R 指出的那样,strlen(i) 导致 未定义的行为 因为 i 被声明为 1 字节并且没有 space for [=20=] char to null 终止字符缓冲区。

你的程序有一些问题,首先我无法在没有 sudo 权限的情况下写入文件:

~/Documents/src/progs : $ echo 1 > /sys/class/afile
bash: /sys/class/afile: Permission denied

如果您尝试对本地目录(而不是根文件夹)中的某些文件执行相同的操作,您应该能够像这样编写文件:

#include <stdio.h>

int main() {
  FILE* pFile = fopen("afile", "w");
  fprintf(pFile, "1\n");

  fclose(pFile);
}