第一时间关注Linux技术干货!
本文字数:1290字
阅读时间:4分钟
作者
良许
一个热爱技术的程序猿
1. 进程间通信的概念
我们知道,在linux环境下,进程与进程之间是相互独立的,每个进程各自都有不同的用户地址空间。一般而言,进程间的进程空间是不能相互访问的。
但在很多情况下,进程与进程之间是需要进程相互通信的,一起来完成某项特定的功能需求。在linux环境下,进程间通信(Inter Process Communication,IPC)是通过内核来完成的。
2. 进程间通信的应用场景
数据传输:一个进程需要将它的一个或多个字节的数据发送给另一个进程;
共享数据:多个进程共享内存某个数据,任意一个进程修改了共享数据,其它进程相应的会得到更改后的数据;
通知事件:一个进程需要向另一个或一组进程发送消息,通知它(们)发生了某种事件(如一个进程向另一个进程发送“终止进程”的信号,对应的进程立即中止)。
资源共享:多个进程之间共享同一个资源。通常情况下,为了实现此功能,需要使用到内核所提供锁和同步机制。
进程控制:某个进程希望完全控制另一个进程的执行,例如,Debug进程。此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。
3. 进程间通信的方式
3.1 管道
管道又分为两种:管道(pipe)及有名管道(named pipe)。而管道又称为无名管道或匿名管道。
管道只能应用于具有血缘关系的进程之间的通信,比如父子进程;
有名管道突破了无名管道只能用于具有血缘关系的进程的限制,它不仅具有无名管道所有功能,还允许无血缘关系的进程间进行通信。
3.2 信号(signal)
信号用于向特定的进程通知有某种事件产生,那个进程根据之前的预设,执行一个具体的函数。信号的语义函数有signal及sigaction,前者比较简单,而后者功能更强大,也更安全。
3.3 信号量(semaphore)
信号量本质是一个计数器,一般将它当作锁机制,来控制多个进程对共享资源的访问。当多个进程,或者同一进程里的多个线程要对某个资源进行访问时,可使用信号量来实现同步。
3.4 消息队列(message queue)
消息队列其实就是一个消息的链表,具有写权限的进程可以往队列里写入消息,而具有读权限的进程可以从队列里读出消息。消息队列比较灵活,比信号承载的信息要多,同时克服了管道缓冲区受限及只能传输无格式字节流的缺点。
3.5 共享内存(shared memory)
这是一种最快的IPC方式,内核在内存里开辟了一块空间,多个进程可以进行访问。正是因为其它的IPC方式速度比较慢,所以才设计了这种通信方式。但为了实现进程间同步及互斥,还需要其它IPC方式,比如信号量,一起配合使用。
3.6 套接字(socket)
这是一种最稳定,最可靠的IPC方式,而且,它不仅可以使用在本机,还可以在不同的机器的进程间实现通信。
本公众号全部博文已整理成一个目录,请在公众号里回复「m」获取!
领取专属 10元无门槛券
私享最新 技术干货