扯一下pipe.

来源:互联网 发布:中国大百科全书淘宝 编辑:程序博客网 时间:2024/05/17 23:26

微笑先上代码:

#include <stdio.h>#include <stdlib.h>#include <unistd.h>int main(){ int pip[2]; if(pipe(pip)==0){   if(fork()==0)    {        close(1);        dup2(pip[1],1);        close(pip[0]);        execlp("ls","ls","-l",NULL);    }  else   {        close(0);        dup2(pip[0],0);        close(pip[1]);         execlp("wc","wc","-l",NULL);   }}return 1;}

这是用管道和子父进程将shell 命令 ls -l的输出做为命令 wc -l的输入。

开始时,调用pipe()创建无名管道,然后fork个子进程。注意,子父进程一开始都用了close()函数,分别是关闭了标准输出和标准输入,然后用dup2()把这俩关联到管道的两端(pip[1]是管道的数据输入端,pip[0]就不用说了)。我之前,很搞不懂一个问题。比如,为什么要close它们!?  close(pip[0])后,父进程怎么还能从管道读数据?   呵呵,当时我是学的不透彻。

现在,来讲讲我的想法:

  看了M.Tim Jones的《GUN/LINUX编程环境》后,渐渐想懂了。为什么close?  其实我觉得close不close没什么关系,不过这种做法在套接字似乎有用,本人不搞套接字,不懂。后面一个问题,首先在fork后子父进程根据CPU调度分别执行,无论哪个先执行都没所谓,不过可以肯定是子进程先返回(因为它是信息发送者),当进程结束后,为管道分配的资源会被自动释放。    所以父进程还可从pip[0]段读取。