Linux下进程间通信

一、常用的进程间通信方式

1、传统的进程间通信方式

1.1、无名管道pipe

1.2、有名管道fifo

1.3、信号signal

2、system v ipc 对象

2.1、共享内存share memory

2.2、消息队列message queue

2.3、信号灯semaphore

3、BSD

3.1、套接字socket

1.1、无名管道pipe

只能用于具有亲缘关系的进程之间的通信;

半双共通信模式,具有固定的读端和写端;

管道可以看成是一种特殊的文件,对于它的读写可以使用文件IO如read、write函数。

管道是基于文件描述符的通信方式。当一个管道建立时,它会创建两个文件描述符fd[0]和fd[1]。其中fd[0]固定用于读管道,而fd[1]固定用于写管道。

当管道中无数据时,读操作会阻塞。管道读写创建进程来实现。

1.2、有名管道可以使互不相关的两个进程互相通信,进程通过文件IO来操作有名管道,有名管道遵循先进先出规则,不支持lseek()操作。有名管道用mkfifo函数创建。

1.3、信号signal通信。信号是在软件层次上对中断机制的一种模拟,是一种异步通信方式。信号可以直接进行用户空间进程和内核进程之间的交互。信号的生存周期,忽略信号、捕捉信号、执行缺省操作。

信号的使用场合。后台进程需要使用信号;如果两个进程没有亲缘关系,无法使用无名管道;如果两个通信进程之一只能使用标准输入和标准输出,则无法使用有名管道。

信号处理的主要方法。使用简单的signal函数;使用信号集函数。

2.1、共享内存是一种最为高效的进程间通信方式,进程可以直接读写内存,不需要任何数据的拷贝;为了在多个进程间交换信息,内核专门留出了一块内存区,可以由需要访问的进程将其映射到自己的私有地址空间;由于多个进程共享一段内存,因此存在竞态。

创建/打开共享内存shmget函数

映射共享内存shmat函数

撤销共享内存映射shmdt函数

删除共享内存对象shmctl函数

2.2、消息队列由消息队列ID来唯一标识;消息队列就是一个消息的列表,用户可以在消息队列中添加消息、读取消息;消息队列可以按照类型来发送接收消息。

2.3、信号灯也叫信号量。它是不同进程间或一个给定进程内部不同线程间同步的机制。二值信号灯与互次锁相似资源可用时值为1,资源不可用时值为0;计数信号灯用来统计资源;等待操作是等待信号灯的值变为大于0,然后将其减一;而释放操作则相反,用来唤醒等待资源的进程或者线程。

System V的信号灯是一个或者多个信号灯的一个集合。其中的每一个都是单独的计数信号灯。而Posix信号灯指的是单个计数信号灯。System V信号灯由内核维护。

信号灯用在共享内存中。


进程间通讯方式比较:

无名管道pipe具有亲缘关系的进程间,单工,数据在内存中

有名管道fifo可用于任意进程间,双工,有文件名,数据在内存中

信号signal唯一的异步通信方式

消息队列msg常用于cs模式中,按消息类型访问,可有优先级

共享内存shm效率最高直接访问内存,需要同步、互次机制

信号灯sem配合共享内存使用,用以实现同步和互次


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值