我正在尝试创建两个子进程并将其通过管道传输,但是第二个子进程并未对第一个执行ls的子进程所产生的输出进行排序。我究竟做错了什么?
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
int pipefd[2];
pid_t ls_pid, wc_pid;
pipe(pipefd);
if ((ls_pid = fork()) == 0) {
dup2(pipefd[1],STDOUT_FILENO);
close(pipefd[0]);
execl("/bin/ls", "ls", 0);
perror("exec ls failed");
exit(EXIT_FAILURE);
}
if ((wc_pid = fork()) == 0) {
dup2(pipefd[0], STDIN_FILENO);
close(pipefd[1]);
execl("/usr/bin/sort", "sort", NULL);
perror("exec wc failed");
exit(EXIT_FAILURE);
}
return EXIT_SUCCESS;
}
最佳答案
排序应该可以,但是代码中有两个警告,首先,请确保在所有包含对fd的引用的进程中关闭fd,否则fd不会关闭,这就是为什么排序过程挂在那里的原因,因为它没有从stdin接收EOF,这是因为父进程中的pipefd没有关闭。另一个是确保等待孩子退出并检查他们的退出状态。将以下内容添加到main函数的send中:
close(pipefd[0]);
close(pipefd[1]);
int status;
int pid = waitpid(ls_pid, &status, 0);
pid = waitpid(wc_pid, &status, 0);