有人可以向我解释为什么这会给出正常行为(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列表的命令。非常感谢帮助。
答案 0 :(得分:2)
char **args = {"ls", NULL};
应为char *args[] = {"ls", NULL};
,第二个args
(cat
)相同。
(现在为时已晚,所以我无法想到第一个编译的原因。至少它会发出警告)。