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

时间:2019-08-01 06:02:19

标签: c linux 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);

结果为“确定”,但文件未更改。

3 个答案:

答案 0 :(得分:1)

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

请尝试使用write(fd, "1", 1)-不需要任何变量或strlen

答案 1 :(得分:0)

这里

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

由于您正在使用open(),因此需要在O_CREAT的第三个参数中提供 mode

open的手册页中

  

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

  

O_CREAT

     

如果路径名不存在,则将其创建为常规文件。

     

mode 参数指定在以下情况下应用的文件模式位   创建一个新文件。 必须在以下情况下提供此参数   ** O_CREAT 或O_TMPFILE在标志中指定; **

例如,您可以尝试

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

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

也在这里

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

@R指出,strlen(i)导致未定义的行为,因为i被声明为1个字节,并且\0字符没有空格为null终止char缓冲区。

答案 2 :(得分:0)

您的程序中存在一些问题,首先,如果没有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);
}