IPC-管道
管道是进程间的一种方式,多个进程可以利用管道进行通信。对于管道的理解可以从与共享内存的区别入手。共享内存是通过获得相同的内存地址,对同一块内存操作,而管道就好比两个进程间建立一个地下通道,必须有打开通道和关闭通道的操作。
管道是半双工的,所有数据流都是按一定顺序进行存取的。管道分为两种:一种是有名管道;一种是无名(匿名)管道。
无名管道:pipe创建,主要用于父子进程之前的数据传递。
有名管道:mkfifo创建,主要用于不相关进程间通信可以理解为创建一个文件,任何进程都可以去读只不过这个文件和普通文件不一样,生成了有名管道后,就可以使用一般的文件I/O函数如open、close、read、write等来对它进行操作。
无名管道:
从代码中可以看到,无名管道的创建会同时打开两个句柄,file_descriptors是一个元素个数为2的数组。fork之后具体要做什么取决于我们想要的数据流的方向。对于从父进程到子进程的管道,父进程关闭管道的读端(fd[0]),子进程关闭管道的写端(fd[1])。
有名管道:
有名管道与无名管道的区别在于有名管道可以根据相同路径在多个进程中(mkfifo)相同的管道句柄,然后根据这个句柄就可以使用file的操作(open,read,write)进行管道数据的读写了。从代码中注意的是打开管道的有阻塞和非阻塞方式。
对于管道的使用有以下几点:
读端不读,写端一直写。导致管道写满,当再次往管道里面写时,会导致阻塞直到有空间才会返回(设置非阻塞方式除外)。
写端不写,但是读端一直读,导致管道为空,当从管道里面读时,会导致阻塞直到有数据才会返回(设置非阻塞方式除外)
读端一直读,且fd[0]保持打开,而写端写了一部分数据不写了,并且关闭fd[1]。
读端读了一部分数据,不读了且关闭fd[0],写端一直在写且f[1]还保持打开状态。
end
专注音视频技术
编程语言学习笔记以及互联网信息分享与交流
扫码关注