linux下进程间通信的几种主要手段简介:
- 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信;
- 信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数);
- 报文(Message)队列(消息队列):消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。
- 共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。
- 信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。
- 套接口(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和System V的变种都支持套接字。
一 管道和FIFO (pipes)
1 管道的关键概念
- 管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道;
-
(在一个父子进程相互通信的过程中,实际上是打开了两个管道)
- 只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程);
- 单独构成一种独立的文件系统:管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统,并且只存在与内存中。
- 数据的读出和写入:一个进程向管道中写的内容被管道另一端的进程读出。写入的内容每次都添加在管道缓冲区的末尾,并且每次都是从缓冲区的头部读出数据。
-
2 FIFO的关键概念
管道应用的一个重大限制是它没有名字,因此,只能用于具有亲缘关系的进程间通信,在有名管道(named pipe或FIFO)提出后,该限制得到了克服。FIFO不同于管道之处在于它提供一个路径名与之关联,以FIFO的文件形式存在于文件系统中。这样,即使与FIFO的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通过FIFO相互通信(能够访问该路径的进程以及FIFO的创建进程之间),因此,通过FIFO不相关的进程也能交换数据。值得注意的是,FIFO严格遵循先进先出(first in first out),对管道及FIFO的读总是从开始处返回数据,对它们的写则把数据添加到末尾。它们不支持诸如lseek()等文件定位操作。
(关于管道详细内容 http://www.ibm.com/developerworks/cn/linux/l-ipc/part1/)
二 信号(signals)
1 信号和信号的来源
信号是在软件层次上对中断机制的一种模拟。在原理上程序收到一个信号与处理器收到一个中断请求可以说是一样的。
信号是异步的,程序不需要通过任何操作来等待、接收信号。信号是interprocess communications唯一异步的通信机制。
2 对信号的响应
1)忽略信号
2)捕捉信号
3)按缺省操作
发送信号的主要函数有:kill()、raise()、 sigqueue()、alarm()、setitimer()以及abort()
可以通过硬件(^c, ^s)和软件(命令 kill)来发送信号。stty -a命令打出来所有键盘所代表的信号。
intr = ^C; quit = ^/; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V
4 信号的关联与接收
如果进程要处理某一信号,那么就要在进程中安装该信号。安装信号主要用来确定信号值及进程针对该信号值的动作之间的映射关系,即进程将要处理哪个信号;该信号被传递给进程时,将执行何种操作。
linux主要有两个函数实现信号的安装:signal()、sigaction()。
http://www.ibm.com/developerworks/cn/linux/l-ipc/part2/index2.html
http://www.ibm.com/developerworks/cn/linux/l-ipc/part2/index1.html
三 消息队列(messagen queues)
管道、FIFO、信号的共有特点是process-persistent,即随进程存在。并且,只能传送无格式的字节流。
消息队列是随内核持续的,只有在内核重起或者显示删除一个消息队列时,该消息队列才会真正被删除。
1 对消息队列的操作
1)打开或创建消息队列
2)读写操作
3)获得或设置消息队列属性
http://www.ibm.com/developerworks/cn/linux/l-ipc/part3/
四 信号灯(semaphores)
信号灯与其他进程间通信方式不大相同,它主要提供对进程间共享资源访问控制机制。相当于内存中的标志,进程可以根据它判定是否能够访问某些共享资源,同时,进程也可以修改该标志。除了用于访问控制外,还可用于进程同步。
二值信号灯:最简单的信号灯形式,信号灯的值只能取0或1,类似于互斥锁。
计算信号灯:信号灯的值可以取任意非负值(当然受内核本身的约束)。

被折叠的 条评论
为什么被折叠?



