我尝试使用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);
结果为“确定”,但文件未更改。
答案 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);
}