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

1.进程间通信(IPC)的方式有:
使用文件系统实现无哦进程共享文件数据、父子进程共享数据段、管道、共享内存、信号量、套接字等等

2.单双工介绍:
单工:数据只能从固定的方向传播,比如广播。
半双工:数据可以双向传播,但同一个时刻只能是一个方向传播。
全双工:同一时刻可以双向传播。

3.有名管道的介绍:
命令:mkfifo name
管道文件和普通文件区别:普通文件的内容存储在磁盘上,而管道文件存储在内存中。
管道文件还是文件,可以使用open,read,write这些函数。
管道的结构:
进程间通信-管道(有名管道和无名管道)
上图中,在管道文件中写入“hello”后的情况。
进程间通信-管道(有名管道和无名管道)
上图中是另外一个进程读取了两个字符后管道的情况。
这个管道文件,在没有读或写时,文件中没有内容,管道文件保存在磁盘上,但是当进程打开这个管道文件进行读写操作时,该管道文件的数据直接保存在内存上。并且读写必须同时进行,否则会发生则塞。

4.无名管道
在有名管道中,先创建管道文件,然后将该文件打开进行读写操作,打开文件后会获得一个读写描述符。所以进程间的数据传递是通过打开的文件描述符进行传递的。核心是得到文件描述符,如果能得到文件描述符,就不需要直到特定的管道文件名。无关系进程间是无法传递读写描述符的,所以无名管道只适用于父子进程间。

有名管道和无名管道区别:
有名管道适用于任意两个进程,无名管道用于父子进程。
无名管道的使用:
使用方法: int fd[2]={0}; pipe(fd);
fd[2]为一个数组,fd[1]是固定的读端,fd[2]是固定的写端。
fork函数是在上两句之后。
父子进程则分别有自己的读端和写端,父进程有自己的fd[0],fd[1],子进程有自己的fd[0],fd[1]
无名管道也是半双工的,所以父进程打开读端,关闭写端,子进程打开写端,关闭读端;或者子进程打开读端,关闭写端,父进程打开写端,关闭读端。要保证数据是单向流动。

管道的读端彻底关闭(父子进程的读端都关闭),,再写数据时会引发异常。操作系统会收到SIGPIPE这个信号,(管道终止信号)。如果程序中出现了异常,并带有管道这个因素时,需考虑这个问题。