我正在尝试创建两个子进程并将其通过管道传输,但是第二个子进程并未对第一个执行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);

10-06 15:49