进程通信linux

本文详细介绍了Linux环境下的进程间通信,包括管道通信、标准流管道、命名管道、信号、信号量和共享内存等机制。重点阐述了各种通信方式的工作原理、API使用以及示例,旨在帮助读者理解Linux进程间通信的实现和应用。
摘要由CSDN通过智能技术生成

1、进程间通信介绍

linux下的进程通信手段基本上是从Unix平台上的进程通信手段继承而来的。
对Unix发展做出重大贡献的两大主力AT&T的贝尔实验室及BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间通信方面的侧重点有所不同。
1)前者对Unix早期的进程间通信手段进行了系统的改进和扩充,形成了“system V IPC”,通信进程局限在单个计算机内;
2)后者则跳过了该限制,形成了基于套接口(socket)的进程间通信机制。

Linux则把两者继承了下来,如图示:


图一给出了linux 所支持的各种IPC手段,在本文接下来的讨论中,为了避免概念上的混淆,在尽可能少提及Unix的各个版本的情况下,所有问题的讨论最终都会归结到Linux环境下的进程间通信上来。并且,对于Linux所支持通信手段的不同实现版本(如对于共享内存来说,有Posix共享内存区以及System V共享内存区两个实现版本),将主要介绍Posix API。


进程通信有如下一些目的:
1)数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M字节之间
2)共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到。
3)通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。
4)资源共享:多个进程之间共享同样的资源。为了作到这一点,需要内核提供锁和同步机制。
5)进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。


进程间通信方式类型:

1)UNIX进程间通信方式:

管道、FIFO、信号。
早期UNIX进程间通信、基于System V进程间通信、基于Socket进程间通信和POSIX进程间通信。
2)System V进程间通信方式:
System V消息队列、System V信号灯、System V共享内存
3)POSIX进程间通信:
posix消息队列、posix信号灯、posix共享内存。


linux进程间通信方式(是以上的方式发展来的):
1)管道(pipe)和有名管道(FIFO)
管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信
2)信号(signal)

信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数)

3)报文(Message)队列(消息队列)
消息队列是消息的链接表,包括Posix消息队列和system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。
消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。
4)共享内存
使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。
5)信号量
主要作为进程间以及同一进程不同线程之间的同步手段
6)套接字(socket)

更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和System V的变种都支持套接字


ipc提供方:

方法 提供方(操作系统或其他环境)
文件 多数操作系统
信号 多数操作系统
Berkeley套接字 多数操作系统
消息队列 多数操作系统
管道 所有的 POSIX 系统, Windows.
命名管道 所有的 POSIX 系统, Windows.
信号量 所有的 POSIX 系统, Windows.
共享内存 所有的 POSIX 系统, Windows.
Message passing
(不共享)
用于 MPI规范,Java RMI, CORBA, MSMQ, MailSlot 以及其他.
Memory-mapped file 所有的 POSIX 系统, Windows.

与直接共享内存地址空间的多线程编程相比,IPC的缺点:

1)采用了某种形式的内核开销,降低了性能;

2)几乎大部分IPC都不是程序设计的自然扩展,往往戏剧性增加了程序复杂度。


2、管道通信

普通的Linux shell都允许重定向,而重定向使用的就是管道。
例如:
ps | grep vsftpd .管道是单向的、先进先出的、无结构的、固定大小的字节流,它把一个进程的标准输出和另一个进程的标准输入连接在一起。写进程在管道的尾端写入数据,读进程在管道的道端读出数据。数据读出后将从管道中移走,其它读进程都不能再读到这些数据。管道提供了简单的流控制机制。进程试图读空管道时,在有数据写入管道前,进程将一直阻塞。同样,管道已经满时,进程再试图写管道,在其它进程从管道中移走数据之前,写进程将一直阻塞。管道主要用于不同进程间通信。

(1)管道创建与关闭

创建一个简单的管道,可以使用系统调用pipe()。它接受一个参数,也就是一个包括两个整数的数组。如果系统调用成功,此数组将包括
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值