【发布时间】:2019-05-11 00:22:11
【问题描述】:
我正在尝试通过 exec 系列函数运行命令行参数(特别是 echo)。如果我编写自己的可执行文件并运行它,我可以运行 execv 函数,但如果我尝试运行 touch 或 echo,它会返回 -1
#include <stdio.h>
#include <unistd.h> // exec functions
#include <sys/types.h> // pid_t
#include <sys/wait.h>
#define HIGH 1
#define LOW 0
int digitalWrite(int pin, short type) {
pid_t pid = fork();
if (pid == 0) {
printf("pid == %i\n", pid);
if (type == HIGH) {
char* args[] = {"echo", "1", ">", "/sys/class/gpio/gpio67/value", NULL};
int val = execv(args[0], args);
printf("ran function execl, %i\n", val);
} else {
printf("Unable to do anything but set pin to HIGH\n");
}
} else if (pid < 0) { // pid < 0
printf("fork failed\n");
}
wait(NULL);
}
int main() {
printf("Starting digitalWrite\n");
digitalWrite(0, HIGH);
printf("Completed digitalWrite()\n");
return 0;
}
只是为了上下文,这是我的构建:
$ gcc wiringbeagle.c
$ ./a.out
Starting digitalWrite
pid == 0
ran function execl, -1
Completed digitalWrite()
Completed digitalWrite()
$ ls
a.out wiringbeagle.c
命令 echo 1 > /sys/class/gpio/gpio67/value 在终端中运行良好,如果我创建一个本地文件(即 touch tmpfile.txt)并尝试运行 echo hi > tmpfile.txt 它在我的命令行中按预期运行但没有在程序中运行。
我一定不理解 execv 的某些内容,非常感谢任何帮助!
【问题讨论】:
-
我很好奇你为什么要使用
exec为你做这件事。 C 提供标准库中内置的文件 I/O。