c - exec 函数只运行一些命令,不会运行 echo
问题描述
我正在尝试通过 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 不了解,任何帮助将不胜感激!
解决方案
第一个参数execv
是要执行的文件。与您的 shell 不同,execv
它不会搜索环境变量指示的目录PATH
,因此您需要为其提供可执行文件的完整路径。除非echo
在当前工作目录中调用了可执行文件,execv("echo",...)
否则将失败并显示“找不到文件”错误。(perror
用于获得更好的错误消息)。
如果您想像 shell 一样搜索可执行文件,请使用execvp
. 但请注意,您的 shell 可能echo
作为内置命令执行,因此它与echo
您的 shell 使用的不同。在这种情况下,这很好。
一旦你解决了这个问题,你会遇到一个不同的问题。由于您只是使用参数调用命令行实用程序,而不是使用 shell,因此参数">"
只是一个参数。它是处理重定向(以及管道、引用和一堆其他有用的东西)的外壳。所以你要做的就是将三个参数发送到标准输出。
您可以使用该system
函数使用 shell 执行命令,或者您可以freopen
在执行execvp
.
man
您可以使用该命令获得大量有关系统接口的信息。例如,要了解做什么freopen
,请使用man freopen
. 您还可以阅读 Internet 上的联机帮助页,例如。http://man7.org/linux/man-pages/man3/freopen.3.html,但是您自己系统上的文档就在那里,并且也适用于您系统上安装的软件的实际版本(假设您安装了文档)。
推荐阅读
- python - SQLAlchemy 自定义关键字参数因 TypeError 失败:'argument' is is an invalid keyword argument for this function
- javascript - 为什么必须 json.parse(buffer.concat(chunks)) 两次?
- php - 处理多个表的sql选择查询
- python - 散景悬停阿尔法和颜色
- python - 让 Python RegEx 更简洁
- python - 检查二维数组是否包含 Numpy 中的特定一维数组
- asp.net-core - 如何解决 aspnet core 2.1 中的版本冲突?(2.1.1 >= 2.1.0-rc1-final)
- powershell - 导入模块速度差异
- couchbase - 我可以在 FTS 匹配后返回文档数据吗?
- aframe - A-frame 想要点击实体显示其他实体