无法通过 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);
}
我正在尝试使用 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);
}