【Linux系统编程】进程间通讯--管道

    首先我们可以思考一下,为什么有多进程编程?通俗来讲,多进程编程是为了让多个子任务同时并发运行,并且彼此间协调工作,以完成一个更大的任务,而不仅仅是数据的增加。而进程间都是相互独立的,要完成进程间通讯,必须共享一些资源。由此引出了进程间通讯的几种方式:管道、信号量、消息队列、共享内存、socket。其中前四种是同一台主机上进程间通讯,最后一种是不同主机上进程间通讯。socket套接字在后边的网络编程中介绍,下面我先介绍管道。

    管道文件只有两种打开方式:(1)只读;(2)只写。打开文件时需要至少一读一写同时打开,由一个进程执行写操作,其余的进程执行读操作。当管道文件为空时,读端会阻塞;当管道写满时,写端会阻塞。通讯数据遵循先进先出的原则,并且都是半双工通讯。管道分为有名管道和无名管道两种。

    1.有名管道

    有名管道又称为命令管道,可以应用于同一台主机上有权限访问的任意n个进程间通讯(n>=2)。有名管道并不占用磁盘block空间,只是在磁盘上存在一个管道文件标识,管道文件大小一直为0。数据缓存在内存上,因此效率相对较高。

管道文件本身在磁盘中,而打开文件以后写入的数据在内存中存储。

     创建方式:命令创建  mkfifo fifo(文件名)

                       代码创建  int mkfifo(const char* pathname,mode_t mode);

     2.无名管道

     无名管道不存在管道文件标识。其原理是:借助父子进程间共享fork()之前打开的文件描述符。因此无名管道只适用于父子进程间通讯,不能在网络间通讯。而且是单向的,只能一端读,一端写。无名管道的数据也在内存中缓存。

     创建方式:int pipe(int fd[2]);

     创建无名管道后得到两个文件描述符,一个读fd[0],一个写fd[1]。先创建无名管道,后fork()。要想关闭无名管道,父子进程都应关闭。

    

  

猜你喜欢

转载自blog.csdn.net/PinkBananA_/article/details/88914969
今日推荐