Linux进程通信IPC--管道Pipe/Named Pipe

原创 2016年08月30日 23:21:58

前言: Linux 进程通信系列文章是对工作中使用的技术进行描述总结,前两篇文章分别讲述了MessageQueue、SharedMemory的方式,同作为Linux 最初支持Unix IPC的方式之一,管道也是进程间通信常用的方式。

管道(Pipe)

管道Pipe是Linux进程间通信的常用方式之一,正如其名字,像一根管子一样把进程A的输出连接到另一个进程B的输入。管道是半双工的,数据只能向一个方向流动,如果需要双方通信时,则必须建立起两个管道。

这里写图片描述

管道实际上是存在于内存中的文件,对这个文件的操作要通过两个已经打开文件描述符file_descriptor(简称fd)进行,两个fd分别代表管道的两端:读端和写端。然而管道是一种特殊独立的文件,不属于某一种文件系统,有独立的文件系统和自己的数据结构。

管道根据适用范围分为:无名管道(Pipe)和命名管道(Named Pipe)。

  • 无名管道(Pipe)

无名管道只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程)。在Linux系统中可以通过系统调用建立起一个单向的通信管道,这种关系只能由父进程来建立且是单向的,因此如果需要双向通信时就需要建立起两个管道。管道两端的进程均将该管道看做一个文件,一个进程向管道中写的内容被管道另一端的进程读出,管道传输遵循“先入先出”(FIFO)的规则,写入的内容每次都添加在管道缓冲区的末尾,并且每次都是从缓冲区的头部读出数据。

  • 命名管道(Named Pipe)

命名管道克服了无名管道只能用于亲缘关系进程之间的缺陷。命名管道是建立在实际的磁盘介质或文件系统上而不是只存在于内存中,有自己名字的文件,它提供一个路径名与之关联,任何进程可以在任何时间通过文件名或路径名与该文件建立联系。命名管道引入了一种新的文件类型—FIFO文件(遵循先进先出的原则),并以FIFO的文件形式存在于文件系统中。即使与FIFO的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通过FIFO相互通信,实现了通过FIFO不相关的进程也能够交换数据。命名管道一旦建立,之后它的读、写以及关闭操作都与普通管道完全相同。

管道API 函数

  • 无名管道Pipe
int pipe(int file_descriptor[2]);

系统调用后,两个返回的文件描述符fd[0]、fd[1]以一种特殊的方式连接起来。fd[1]用于写入数据,fd[0]用于读出数据,写到fd[1]的所有数据都可以fd[0]读出来,相关数据遵循先进先出的原则(简写FIFO)。

  • 命名管道Named Pipe
int mkfifo(const char *filename, mode_t mode);
int mknode(const char *filename, mode_t mode|S_IFIFO,(dev_t)0);

mkfifo/mknode会依参数filename建立特殊的FIFO文件,该文件必须不存在,参数mode为该文件的权限。建立的FIFO文件其他进程都可以用读写一般文件的方式存取。

管道使用举例

  • 无名管道Pipe
int main(void)
{
    int n;
    int fd[2];
    pid_t pid;
    char line[MAXLINE];

    if(pipe(fd)< 0){        //先建立管道得到一对文件描述符
        exit(0);
    }

    if((pid = fork()) < 0)  //父进程把文件描述符复制给子进程
        exit(1);
    else if(pid > 0){       //父进程写
        close(fd[0]);       //关闭读描述符
        write(fd[1], "\nhello world\n", 14);
    }
    else{                   //子进程读
        close(fd[1]);       //关闭写端
        n = read(fd[0], line, MAXLINE);
        write(STDOUT_FILENO, line, n);
    }

    exit(0);
}
  • 命名管道Named Pipe
int main()  
{  
    int res = mkfifo("/tmp/my_fifo", 0777);  //创建FIFO文件
    if (res == 0)  
    {  
        printf("FIFO created/n");  
    }  
     exit(EXIT_SUCCESS);  
}

FIFO文件创建后,即可进行读写操作。

版权声明:本文为博主原创和转载(已表明出处)文章,欢迎交流。

相关文章推荐

Linux进程通信(一)——pipe管道

本章内容 采用pipe管道如何进行进程之间的通信 pipe管道进程通信的规则和限制 Linux中pipe管道的实现机制和管理pipe管道的结构体 什么是进程通信进程通信就是两个进程之间进行数据交换,在...

Linux进程通信-管道(pipe)

简述  在Linux系统中,管道是一种最基本的IPC机制,要理解管道的机制,我们可以举一个简单的例子,在linux系统下的进程都是独立,如果两个进程需要交流也就是通信,我们需要开辟一个他们两个可以共同...
  • Exziro
  • Exziro
  • 2017年06月06日 12:32
  • 190

浅谈linux系统下的进程通信之管道pipe

一、浅谈进程通信和管道            谈到进程间通信,就是在数据上不同进程上的共享,让不同的进程看到同一份物理内存。此过程必须通过内核(就是同常意义上的操作系统),在内核中开辟一块缓冲区,把进...
  • pamelay
  • pamelay
  • 2017年02月16日 18:42
  • 107

Linux 进程通信(System V) 第一节 ------> 管道 pipe

简介: 一. #include int pipe(int fd[2]);    //!>注意参数是fd[0]是读的文件描述符,fd[1]是用来写的文件描述符 一般用于 “父子进...

进程间通信---------有名管道(named pipe/FIFO)

1、有名管道相关概念 管道应用的一个重大限制是它没有名字,因此,只能用于具有亲缘关系的进程间通信,在有名管道(named pipe或FIFO)提出后,该限制得到了克服。FIFO不同于管道之处在于...

APUE学习之----进程通信pipe实现管道

一,pipe()介绍 管道的特点: 1.管道是半双工的,即同一时间数据只能从一端流向另一端。试想,如果一个管道从两边同时输入和输出数据,那么管道里的数据就乱了。 2.管道的两端一端作为读端,一...

进程通信之管道(PIPE)

在前面进程通信概念和进程通信方式,我们了解了进程通信的简单概念以及4种进程通信的方式,今天我们将要通过具体实例来学习,理解进程通信方式中的管道(PIPE)。本文所有代码都在Ubuntu16.04测试。...

进程间通信(IPC):管道(Pipe)

管道:一个进程连接数据流到另一个程序 pipe函数的原型: #include int pipe(int file_descriptor[2]);该闪身在数组中填上两个新的文件描述符后返回0,如...

进程间通信-管道 IPC pipe

进程间通信-管道 IPC pipe@(Linux)参考http://akaedu.github.io/book/ch30s04.html#id2868153问题1在例 30.7 “管道”中,父进程只用...

进程间通信IPC之--无名管道(pipe)和有名管道(fifo)

转载于:http://blog.chinaunix.net/uid-25365622-id-3059840.html 每个进程各自有不同的用户地址空间,任何一个进 程的全局变量在另一个进程中...
  • nawei87
  • nawei87
  • 2015年07月31日 15:52
  • 305
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux进程通信IPC--管道Pipe/Named Pipe
举报原因:
原因补充:

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