파이프의 execlp "정렬" 입력이 중단되었습니다. 이유는 무엇입니까?

파이프의 execlp "정렬" 입력이 중단되었습니다. 이유는 무엇입니까?

sort기다리고 있지만 뭐? 나는 그것을 시도했고 execlp("head", "head", "-n", "3", NULL);훌륭하게 sort작동합니다.

#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>
#include <assert.h>
int main()
{
  int p[2], cat_pid, sort_pid;
  if (pipe(p) < 0) { assert(0 && "pipe fail"); }
  if ((cat_pid = fork()) == 0) { dup2(p[1], 1); execlp("cat", "cat", "text", NULL); assert(0 && "cat fail"); }
  if ((sort_pid = fork()) == 0) { dup2(p[0], 0); execlp("sort", "sort", NULL); assert(0 && "sort fail"); }
  waitpid(sort_pid, NULL, 0);
}

입력은 다음 text과 같습니다

hello
world
foo
bar

답변1

EOF를 기다리는 동안 sort파이프의 쓰기 쪽을 닫아야 합니다. 하나는 완료 후 닫히고 cat다른 하나는 상위 프로세스에 있습니다. 상위 파이프의 쓰기 쪽을 닫으면 모든 것이 잘 됩니다.

man 7 pipe

파이프의 쓰기 끝을 참조하는 모든 파일 설명자가 닫힌 경우 파이프에서 read(2)를 시도하면 파일 끝이 표시됩니다(read(2)는 0을 반환함).

관련 정보