Pipe

使用管道卡住的輸入執行 execlp“排序”,為什麼?

  • February 17, 2022

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

sort等待 EOF 時,您需要關閉管道的寫入端。一個在完成後關閉cat,另一個在父程序中。關閉管道’在父級中寫入結束,一切都應該正常。

man 7 pipe

如果引用管道寫入端的所有文件描述符都已關閉,則嘗試從管道讀取(2)將看到文件結束(讀取(2)將返回 0)。

引用自:https://unix.stackexchange.com/questions/691054