C执行管道:execlp工作,而execvp没有

时间:2013-01-25 22:41:07

标签: c exec fork pipe gnu

有人可以向我解释为什么这会给出正常行为(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列表的命令。非常感谢帮助。

1 个答案:

答案 0 :(得分:2)

char **args = {"ls", NULL};应为char *args[] = {"ls", NULL};,第二个argscat)相同。

(现在为时已晚,所以我无法想到第一个编译的原因。至少它会发出警告)。