linux内核的进程间通信机制(IPC)
(1)(无名)管道和有名管道
(2)SystemV IPC:信号量、消息队列、共享内存
(3)信号
(4)Socket域套接字
一、(无名)管道和有名管道
1. 管道(无名管道)
(1)管道通信的原理:内核维护的一块内存,有读端和写端
(2)管道通信的方法:父进程创建管理后fork子进程,子进程继承父进程的管道fd
(3)管道通信的限制:只能在父子进程间通信、半双工
(4)管道通信的函数:pipe、write、read、close
2. 有名管道(fifo)
(1)有名管道的原理:实质也是内核维护的一块内存,表现形式为一个有名字的文件
(2)有名管道的使用方法:固定一个文件名,2个进程分别使用mkfifo创建fifo文件,然后分别open打开获取到fd,然后一个读一个写
(3)管道通信限制:半双工(注意不限父子进程,任意2个进程都可)
(4)管道通信的函数:mkfifo、open、write、read、close
详解:http://blog.csdn.net/qiuoooooo/article/details/60586934
二、信号量(semaphore)
实现不同进程间或同一进程间的不同线程间的同步和互斥
二值信号量:(常用)其值只有0、1 两种选择,0表示资源被锁,1表示资源可用;
(信号量的初始值设为1,P操作-1,资源被锁;V操作+1,资源可用)
计数信号量:其值在0 和某个限定值之间,不限定资源数只在0 1 之间;
计数信号量集:多个信号量的集合组成信号量集
详解:http://blog.csdn.net/qiuoooooo/article/details/60573433
三、共享内存
① 共享内存允许多个进程使用同一块内存,数据不需要在进程之间复制,多个进程都把该内存区域映射到自己的虚拟地址空间,
直接访问该共享内存区域,当一个进程改变了这块地址中的内容的时候,其它进程都会察觉到这个更改。
② 共享内存在各种进程间通信方式中具有最高的效率。访问共享内存区域并不需要通过系统调用或者其它需要切入内核的过程来完成。
③因为系统内核没有对访问共享内存进行同步,必须自己提供同步措施。
例如,在数据被写入之前不允许进程从共享内存中读取信息、不允许两个进程同时向同一个共享内存地址写入数据等。
解决方法:使用信号量进行同步。
详解:http://blog.csdn.net/qiuoooooo/article/details/59066613
四、消息队列
由于消息缓冲机制中所使用的缓冲区为公用缓冲区,因此使用消息缓冲机制传送数据时,两通信进程必须满足如下条件:
① 在发送进程把写入消息的缓冲区挂入消息队列时,应禁止其他进程对该消息队列的访问,否则,将引起消息队列的混乱。
同理,当接收进程正从消息队列中取消息时,也应禁止其他进程对该队列的访问。
② 当缓冲区中无消息存在时,接收进程不能接收到任何消息;而发送进程是否可以发送消息,则只由发送进程是否能够申请到缓冲区决定。
注意:MESSAGE QUEUE就是起信箱作用,到了就挂在那里,需要的时候去取。但是速度较慢,自带同步机制。
详解:待补充....QAQ
五、信号
① 信号又称软中断,是内容受限的一种异步通信机制。
② 信号由谁发出?
(1)用户在终端按下按键
(2)硬件异常后由操作系统内核发出信号
(3)用户使用kill命令向其他进程发出信号
(4)某种软件条件满足后也会发出信号,如alarm闹钟时间到会产生SIGALARM信号,向一个读端已经关闭的管道write时会产生SIGPIPE信号
③ 信号处理
(1)忽略信号
(2)捕获信号(信号绑定了一个函数)
(3)默认处理(当前进程没有明显的管这个信号,默认:忽略或终止进程)