当前位置:  技术问答>linux和unix

管道和父子进程的问题

    来源: 互联网  发布时间:2016-06-04

    本文导语:  #include  #include  #include  int main(){         pid_t pid;         int fd[2];         pipe(fd);         pid = fork();         if(pid==0){                 dup2(fd[1],STDOUT_FILENO);                 exec...

#include 
#include 
#include 


int main(){
        pid_t pid;
        int fd[2];
        pipe(fd);
        pid = fork();
        if(pid==0){
                dup2(fd[1],STDOUT_FILENO);
                execlp("ls","ls","-l",NULL);
        }
        waitpid(pid,NULL,0);
        pid = fork();
        if(pid==0){
                dup2(fd[0],STDIN_FILENO);
                execlp("grep","grep","Inifok",NULL);
        }
        waitpid(pid,NULL,0);  //父进程阻塞在这里
        printf("donen");
}

我想实现shell下面的管道功能,第一个子进程做ls命令,然后第二个子进程做grep命令,
但是第二个子进程没有结束,请问是为什么?难道是管道里面没有文件结束符吗?
如果我想实现多重管道,比如说 ls | grep Inifok | wc 
程序应该如何写?谢谢了。。。

|
#include 
#include 
#include 


int main()
{
        pid_t pid;
        int fd[2];
        pipe(fd);
        pid = fork();
        if(pid==0){
                dup2(fd[1],STDOUT_FILENO);
                close(fd[0]);
                execlp("ls","ls","-l",NULL);
        }
        close(fd[1]);    //要把父进程的管道关掉
        waitpid(pid,NULL,0);
        pid = fork();
        if(pid==0){
                dup2(fd[0],STDIN_FILENO);
                close(fd[1]);
                execlp("grep","grep","c",NULL);
        }
        close(fd[0]);    //关掉
        waitpid(pid,NULL,0);  //父进程阻塞在这里
        printf("donen");
}

如果父进程的管道不关掉,子进程读管道的时候会阻塞;如果管道写端全部被关掉了,read才会返回0

|
2楼是对的!再加点解释性文字:

管道两端可分别用描述字fd[0]以及fd[1]来描述,需要注意的是,管道的两端是固定了任务的。即一端只能用于

读,由描述字fd[0]表示,称其为管道读端;另一端则只能用于写,由描述字fd[1]来表示,称其为管道写端。如

果试图从管道写端读取数据,或者向管道读端写入数据都将导致错误发生。一般文件的I/O函数都可以用于管道,

如close、read、write等等。

从管道中读取数据:

    
* 如果管道的写端不存在,则认为已经读到了数据的末尾,读函数返回的读出字节数为0;
    
* 当管道的写端存在时,如果请求的字节数目大于PIPE_BUF,则返回管道中现有的数据字节数,如果请求的字节

数目不大于PIPE_BUF,则返回管道中现有数据字节数(此时,管道中数据量小于请求的数据量);或者返回请求

的字节数(此时,管道中数据量不小于请求的数据量)。

注:(PIPE_BUF在 include/linux/limits.h中定义,不同的内核版本可能会有所不同。Posix.1要求PIPE_BUF至

少为512字节,red hat 7.2中为4096)。

摘自这里:http://www.ibm.com/developerworks/cn/linux/l-ipc/part1/

    
 
 

您可能感兴趣的文章:

  • 请教个父子进程管道问题
  • 父子进程之间管道通信问题
  • 在用管道通信父子进程遇到问题
  • 多进程通讯的管道相关问题
  • 如何实现管道和后台进程
  • linux进程管道通信
  • 为什么无名管道只能在具有亲缘关系的进程之间进行通信?
  • 多个进程同时写一个管道会不会有问题???
  • 一个进程中能够打开两个管道么 一个读 一个写
  • 管道中的父进程要不要等待子进程的退出?
  • 关于进程与管道的问题,谢谢。
  • 守护进程和fork()以及管道通信的结合
  • 进程间通信---关于管道
  • 安全管道守护进程 Spiped
  • linux进程间通信(管道)的问题
  • 用无名管道实现进程通信,可是出错了,打击哦
  • linux进程管道通信C语言编程:程序有问题,请指点迷津
  • linux进程间通信(命名管道)的问题
  • 初学.请帮忙看看fork的子进程读管道时为何阻塞!
  • Linux中管道的使用(父或子进程中能否都保留读写端)
  • 如何用命名管道(FIFO)实现非阻塞模式进程间通讯(IPC)?
  • 利用双管道进行进程的数据通信
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • linux管道问题,管道建立后如何同步?
  • 哪位大侠知道Linux里的有名管道传送数据快不快?有名管道操作的过程是否有读写硬盘的操作?
  • 1哪位大侠知道Linux里的有名管道传送数据快不快?有名管道操作的过程是否有读写硬盘的操作?
  • 怎么样以非阻塞的方式从管道中读取数据?因为我用read函数时,如果管道没有数据就会阻塞住???
  • (100)"断开的管道" 在Socket编程当中,如果我连续发送包,例如1000次,总会出现"断开的管道"的错误提示,请问如何解决
  • 管道(|)是怎么实现的?
  • 我用管道作为一个程序的标准输入时,程序报错说不是一个终端不能做为标准输入,请问怎么样管道成为它的标准输入呢???具体错误信息见内
  • 请问何时删除命名管道哪?
  • Linux下面的"匿名管道",是否对应着某种实体?
  • 串口和管道诡异的问题,在线急等解答
  • 请问如何让自己编写的Shell程序支持管道?
  • 命名管道open时被阻塞了
  • 关于有名管道的权限问题?
  • 命名管道问题
  • linux 管道通信
  • 关于管道的用法
  • 数据库 iis7站长之家
  • 创建了一个管道,写入数据正确,读数据失败。为什么?
  • 什么原因可以造成管道破裂?
  • 匿名管道的堵塞


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3