进程间通信之管道

原创 2018年04月17日 15:41:03

管道(本质是内核的缓存): 一个进程到另一个进程的数据流。大小一般为4K。(一页也是4K,高效).

限制:

1.半双工通信

2.只能在有亲缘关系的进程间使用(有公共祖先),通常,一个管道有一个进程创建,然后该进程调用fork,此后父、子进程就可应用该管道。

管道的创建:

int pipe(int fildes[2]); //filedes[0]为读而打开,filedes[1]为了写而打开。 filedes[1]的输出是filedes[0]的输入。

返回值:成功返回0,若出错返回-1;


简单说明:当没有数据读的时候,read()会阻塞

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    //建立管道
    int fds[2];
    if (-1 == pipe(fds)) perror("pipe"), exit(1);
    pid_t pid = fork();
    if(-1 == pid){
        perror("fork");
        exit(1);
    }
    else if(0 == pid)   //子进程读
    {
        close(fds[1]);   //不写
        char buf[1024] = {};
        while(1)
        {
            int r;
            memset(buf, 0x00, sizeof(buf));
            r = read(fds[0], buf, sizeof(buf));
            if(-1 == r)perror("read"), exit(1);
            if(0 == r) break;
            printf("child read = %s\n", buf);
        }
        
    }else  //父进程写
    {
        close(fds[0]);
        char buf[1024] = {};
        while(fgets(buf, sizeof(buf), stdin) != NULL)
        {
            int w;
            w = write(fds[1], buf, strlen(buf));
            if(-1 == w) perror("write"), exit(1);
            memset(buf, 0x00, sizeof(buf));
        }
    }
    return 0;
}
shell管道的实现:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int main()
{
    //建立管道
    int fds[2];
    if(-1 ==  pipe(fds)) perror("pipe"), exit(1);
    pid_t pid = fork();
    if(-1 == pid){
        perror("fork");
        exit(1);
    }
    else if(0 == pid)//子进程写
    {
        close(fds[0]);  //不读
        close(1);       //关掉标准输出
        dup(fds[1]);    //写到管道的写端
        execlp("ls", "ls", "-l", NULL);
        close(fds[1]);
        printf("替换进程失败\n");

    }else  //父进程读
    {
        close(fds[1]);  //不写
        close(0);       //关掉标准输出
        dup(fds[0]);    //输出到管道的读端
        execlp("wc", "wc", "-l", NULL);
        close(fds[0]);
        printf("替换进程失败\n");
    }
    return 0;
}



版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/bian_cheng_ru_men/article/details/79969517

进程间通信:管道(pipe)

管道的概述 管道也叫无名管道,它是是 UNIX 系统 IPC(进程间通信) 的最古老形式,所有的 UNIX 系统都支持这种通信机制。 无名管道有如下特点: 1、半双工...
  • lianghe_work
  • lianghe_work
  • 2015-08-16 23:19:43
  • 4698

进程间通信:管道及命名管道(代码实现)

管道:1.管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道;             2.只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程);             3...
  • wangiijing
  • wangiijing
  • 2016-07-07 21:03:31
  • 2791

进程间通信之管道篇

何为进程间通信 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都是看不到的。所以进程之间如果要交换数据就必须通过内核。 在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核...
  • qq_33724710
  • qq_33724710
  • 2016-08-28 14:22:55
  • 800

【Linux】进程间通信之管道

每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数...
  • Scenlyf
  • Scenlyf
  • 2016-07-25 21:05:51
  • 1136

进程间通信方式总结——管道(一)

Linux/Unix系统IPC是各种进程间通信方式的统称,但是其中极少能在所有Linux/Unix系统实现中进行移植。随着POSIX和Open Group(X/Open)标准化的推进呵护影响的扩大...
  • tf_apologize
  • tf_apologize
  • 2017-04-13 16:28:47
  • 555

进程间的通信方式——pipe(管道)

详解进程间通信方式———管道;管道是如何实现进程间通信的;以及管道读取数据的四种方式,以及管道容量的大小。...
  • skyroben
  • skyroben
  • 2017-05-10 00:43:13
  • 7003

进程间通信-管道(PIPE)和有名管道(FIFO)

前面我们学习了一下进程,我们知道多,进程间的地址空间相对独立。进程与进程间不能像线程间通过全局变量通信。 如果想进程间通信,就需要其他机制。          常用的进程间通信方式有这...
  • w616589292
  • w616589292
  • 2016-03-22 18:52:34
  • 2745

孙鑫vc++ 17 进程间通信(3) 命名管道

一、基础知识 1.命名管道 (1)命名管道是围绕Windows文件系统设计的一种机制,采用“‘命名管道文件系统’(Named Pipe File System,NPFS)“接口 (2)命名管道通...
  • wang_cong0214
  • wang_cong0214
  • 2013-01-07 13:51:49
  • 2928

Python下的进程间通信-管道

背景:在python下利用subprocess模块实现进程间的通信。 使用subprocess包中的函数创建子进程的时候,要注意: 1) 在创建子进程之后,父进程是否暂停,并等待子进程运行。 2...
  • ljp1919
  • ljp1919
  • 2017-03-25 18:30:20
  • 1080

进程间通信方式之有名管道

在上一篇介绍了进程间通信方式之管道,链接如下: http://blog.csdn.net/zhuyunfei/article/details/51087802 今天再来介绍下进程间通信方式之有名管...
  • zhuyunfei
  • zhuyunfei
  • 2016-04-17 20:11:32
  • 1759
收藏助手
不良信息举报
您举报文章:进程间通信之管道
举报原因:
原因补充:

(最多只允许输入30个字)