![execlp 对来自管道的输入进行“排序”卡住了,为什么?](https://linux22.com/image/202525/execlp%20%E5%AF%B9%E6%9D%A5%E8%87%AA%E7%AE%A1%E9%81%93%E7%9A%84%E8%BE%93%E5%85%A5%E8%BF%9B%E8%A1%8C%E2%80%9C%E6%8E%92%E5%BA%8F%E2%80%9D%E5%8D%A1%E4%BD%8F%E4%BA%86%EF%BC%8C%E4%B8%BA%E4%BB%80%E4%B9%88%EF%BC%9F.png)
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
在sort
等待 EOF 时,您需要关闭管道的写入端。一个在完成后关闭cat
,另一个在父进程中。关闭父级管道的写入端,一切都会顺利。
man 7 pipe
如果引用管道写入端的所有文件描述符都已关闭,则尝试从管道读取(2)将看到文件结尾(读取(2)将返回0)。