Linux16 进程间通信(一) 管道

进程间通信:管道、信号量、共享内存、消息队列、socket、stream

管道

       半双工,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道;可以通过sockpair实现全双工管道。分为pipe(无名管道)和fifo(命名管道)两种,除了建立、打开、删除的方式不同外,这两种管道几乎是一样的。他们都是通过内核缓冲区实现数据传输。

        管道一端的进程顺序地将进程数据写入缓冲区,另一端的进程则顺序地读取数据,该缓冲区可以看做一个循环队列,读和写的位置都是自动增加的,一个数据只能被读一次,读出以后再缓冲区都不复存在了。当缓冲区读空或者写满时,有一定的规则控制相应的读进程或写进程是否进入等待队列,当空的缓冲区有新数据写入或慢的缓冲区有数据读出时,就唤醒等待队列中的进程继续读写。

有名管道  

       在磁盘上会存在一个管道文件标识,像普通文件一样,可以创建,但是管道文件不占用磁盘空间,数据会缓存在内存上。共享VFS。命令创建mkfifo,代码创建mkfifo(),open :A进程写数据,B进程不读就没有意义。如果A进程结束,B进程也结束。管道写端关闭,读端返回值为0。  读写必须同时存在,可以两个读一个写,两个写一个读,只有读或者只有写,open是不会返回的。读或者写关闭,另一端就会出错返回。读和写的次数没有直接关系。open成功以后,写端不写,读端阻塞。读端不读,写端缓冲区满,写端阻塞。

Linux16 进程间通信(一) 管道    

Linux16 进程间通信(一) 管道  

Linux16 进程间通信(一) 管道              

    无名管道

其原理是借助父子进程间共享fork之前打开的文件描述符,无名管道的数据内容也存在内存上,仅限于父子进程之间。

Linux16 进程间通信(一) 管道

Linux16 进程间通信(一) 管道

Linux16 进程间通信(一) 管道

popen和pclose函数后期可能会用。