我们的作业需要使用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*。两个ks都应该声明为char* k[] = …。如果编译器没有对此发出警告,则需要启用更多警告。
与评论相反,您正确地使用了closedup(但是dup2会更好)。

关于c - 执行execve()的正确步骤是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57245103/

10-12 18:48