执行 execve() 的正确步骤是什么?

What is the correct step to execute execve()?

我们的作业需要使用pipe()、fork()、execve() 和dup() 来实现一个简单的带有管道的终端命令执行。因此,我了解了 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;
}

看起来 运行 代码没有任何结果,我不确定我还需要什么才能让它工作。

我期待输出 3,您将通过输入

看到

echo one two three | wc -w 在终端中。顺便说一句,我使用的是 MacOS。

问题是您将字符串数组分配给 char*。两个 k 都应声明为 char* k[] = …。如果您的编译器没有对此发出警告,您需要启用更多警告。

与评论相反,您正确使用了 closedup(但 dup2 会更好)。