Pipe
使用管道卡住的輸入執行 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
在
sort
等待 EOF 時,您需要關閉管道的寫入端。一個在完成後關閉cat
,另一個在父程序中。關閉管道’在父級中寫入結束,一切都應該正常。
man 7 pipe
如果引用管道寫入端的所有文件描述符都已關閉,則嘗試從管道讀取(2)將看到文件結束(讀取(2)將返回 0)。