系统编程六

来源:互联网 发布:淘宝客鹊桥插件手机版 编辑:程序博客网 时间:2024/05/19 02:05

主要是讲进程之间的通信

传统的进程间通信:

无名管道(pipe) 有名管道(fifo) 信号(signal)

System v ipc对象:

共享内存 消息队列 信号量 POSIX信号量(无名、有名)

BSD:

套接字(主机与主机之间)

管道有三种:无名管道(pipe) 、有名管道(fifo) 、套接字

无名管道:用于一对一,而且要亲缘关系,而且数据量少。P1进程把数据通过管道发给内核,P2进程再通过管道从内

核中读出来,优点是由于P1,P2不是面对面传输的,而是通过管道内核,所以有些数据会不会阻塞啊,这些东西都不用你自己管,内核会帮你弄好。有名管道就适用于任何两个进程。

如果要数据量大量传输,就要用共享内存,它效率高,没有经过内核的中转。是面对面的,但是要用信号量,互斥锁来进行保护。消息队列是增强型的fifo,但是效率不高。

无名管道不保证写入原子性,什么意思呢?原子性就是不可分割,不保证写入原子性就是可分割,如果同时有P1,P2

进程写入同一管道,这两个进程之间的数据信息都会混合在一起,而不是有先后顺序,所以才有了无名管道只允许一

对一通信。程序大概就是父进程创建一个管道,获得读(fd[0])和写(fd[1])的描述符,父进程创建一个子进程的同时子进程也获得该管道的读写描述符,所以就可以进行读写操作了。


写者就是拥有这个管道的写描述符 读者就是拥有这个管道的读描写符。

pipe broken是指管道的读端堵住了,没有读者,你还写进去不就broken吗?

下图是管道的读写特性:

当有这个管道的写描述符时,有数据就正常读出来,没数据就阻塞等待,当没有管道的写描述符时,有数据就读出来,无数据就返回来。

当有这个管道的读描述符时,缓冲区满的话,就阻塞等待,缓冲区未满,就写入。当没有管道的读描述符时,无论如何写进去都没用,会立即收到信号SIGPIPE。

阅读全文
0 0