0

有人可以向我解释为什么这会产生正常行为(ls | cat)

int fd[2]; pipe(fd);
pid_t pid = fork();
if(pid > 0) {
    close(fd[0]);
    close(STDOUT_FILENO);
    dup2(fd[1],STDOUT_FILENO);
    execlp("ls","ls",NULL);
} else if (pid == 0) {
    close(fd[1]);
    close(STDIN_FILENO);
    dup2(fd[0],STDIN_FILENO);
    execlp("cat","cat",NULL);
} else {
    error(1, errno, "forking error");
}

但是当我将 execlp 更改为 execvp 突然没有输出并且退出状态为 255 时?代码:

int fd[2]; pipe(fd);
pid_t pid = fork();
if(pid > 0) {
    close(fd[0]);
    close(STDOUT_FILENO);
    dup2(fd[1],STDOUT_FILENO);
    char **args = {"ls", NULL};
    execvp("ls",args);
} else if (pid == 0) {
    close(fd[1]);
    close(STDIN_FILENO);
    dup2(fd[0],STDIN_FILENO);
    char **args = {"cat", NULL};
    execvp("cat",args);
} else {
    error(1, errno, "forking error");
}

我真的很想使用 execvp 因为我将使用可变长度的 arg 列表执行命令。帮助将不胜感激。

4

1 回答 1

2

char **args = {"ls", NULL};应该是char *args[] = {"ls", NULL};,并且对于第二个args(对于cat)相同。

(这里太晚了,所以我想不出第一个编译的原因。至少它给出了警告)。

于 2013-01-25T22:48:07.170 回答