Linux进程间通信-几种通信方式的比较

前面几篇关于Linux进程间通信(单机通信)差不多就告一段落,以后有什么需要补充的再补充。既然写了几篇进程间通信,那么今天我们就来总结总结,比较一下这几种通信方式,看看在什么样的情况下适用于什么样的通信方式。这篇就不具体写函数实现和具体的参数了,大家可以在前面几篇看。

第一种通讯方式:管道

在内存中创建一个管道,它不属于任何区域或进程。

有名管道:应用于任意两个进程之间数据的单向传递。

无名管道:相对于有名管道而言的,无名管道在使用时产生,不使用后释放,并不会在系统上留下痕迹。无名管道因其使用前没有任何标识,所以它只能应用于父子进程之间。

注:因为管道是半双工通讯,而无名管道创建后,父进程在fork产生子进程后,两个进程分别有一对读写,所以要在父子进程中分别关闭读或写。

第二种通讯方式:信号量

信号量作用:进程间同步控制(用于多进程访问临界资源)

信号量相当于记录资源能同时被多少个进程访问。函数semctl中第四个参数(union semun arg 它是可选的参数)是一个联合体,里面的对象val的值,0表示a和b是服务关系(比如a进程执行完b进程再开始执行),1表示a和b是竞争关系(a,b进程抢占一个资源)。

第三种通讯方式:消息队列

消息:数据&类型

消息队列:是一种临时存储消息的队列,完成进程间数据传递,不过它不同于普通的队列(先进先出),它是一种优先级队列,根据用户选择的数据类型,优先获取对应数据类型的数据。

与信号量对比:都以内核对象来确保多进程访问同一个消息队列,信号量进行进程同步控制,而消息队列发送实际数据。

与管道对比:管道发送的数据没有类型,读取数据端无差别从管道中按照数据的前后顺序读取数据,消息队列数据有类型,读端可以根据数据类型读取特定数据。

第四种通讯方式:共享内存

共享内存也有内核对象来管理共享内存区域

Linux进程间通信-几种通信方式的比较_第1张图片

共享内存是最快的一种IPC,在各个进程都有指针直接指向开辟内存区域。访问时当做本进程中的内存控制直接操作。

共享内存是两个以上的进程能够操作同一块物理空间的内存区域,所以共享的区域就成了临界资源,所以对于共享区域的访问必须做同步控制。(通常使用信号量)

你可能感兴趣的:(Linux)