我们的作业需要使用pipe()、fork()、execve()和dup()来实现使用pipe执行终端命令的简单过程。所以我阅读了dup和pipe如何操作文件描述符,并生成了下面的代码。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
int pfds[2];
pipe(pfds);
if (!fork()) {
close(1); /* close normal stdout */
dup(pfds[1]); /* make stdout same as pfds[1] */
close(pfds[0]); /* we don't need this */
char *k = {"echo", "one", "two", "three", NULL};
execve("/bin/echo", k, NULL);
} else {
close(0); /* close normal stdin */
dup(pfds[0]); /* make stdin same as pfds[0] */
close(pfds[1]); /* we don't need this */
char *k = {"wc", "-w", NULL};
execve("/usr/bin/wc", k, NULL);
}
return 0;
}
运行代码似乎没有任何结果,我不确定还需要什么才能使它工作。
我正等着三局出局,你可以进去看看
echo one two three | wc -w
在终端。顺便说一句,我在用MacOS。 最佳答案
问题是,您正在将字符串数组赋给char*
。两个k
s都应该声明为char* k[] = …
。如果编译器没有对此发出警告,则需要启用更多警告。
与评论相反,您正确地使用了close
和dup
(但是dup2
会更好)。
关于c - 执行execve()的正确步骤是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57245103/