Linux下进程间通信(小结)下

本文总结了Linux下进程间通信的三种方式:共享内存、消息队列和信号量。共享内存是最快的共享数据方法,涉及shmget()、shmat()和shmdt()函数。消息队列是有序消息链表,通过msgget()、msgsnd()、msgrcv()和msgctl()操作。信号量用于资源保护和进程同步,涉及semget()、semctl()和semop()函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

四、共享内存

共享内存是被多个进程共享的一部分物理内存。共享内存是进程间共享数据的一种最快的方法,一个进程向共享内存区域写入了数据,共享这个内存区域的所有进程就可以立刻看到其中的内容。由于多个进程共享一段内存,因此也需要依靠某种同步机制。

共享内存的实现分为两个步骤,第一步是创建共享内存,使用shmget(),也就是从内存中获得一段共享内存区域,第二步映射共享内存,也就是把这段内存映射到具体的进程空间中,使用函数shmat()。当一个进程不再需要共享内存时,需要把它从进程地址空间中脱离,使用shmdt()函数。

此三个函数的语法要点如下:

五、消息队列

消息队列就是一个消息的链表。可以把消息看做一个记录,具有特定的格式。进程可以向里面按照一定的规则添加新消息;另一个进程可以从消息队列中读走消息。消息队列具有一定的FIFO特性,但是它可以实现消息的随机查询,具有更大的优势。

消息队列的实现包括创建或打开消息队列(msgget())、添加消息(msgsnd())、读取消息(msgrcv())和控制消息队列(msgctl())。

消息队列的内核持续性要求每个消息队列在系统范围内对应唯一的键值,所以,要获得一个消息队列的描述符,必须提供该消息队列的键值,可以使用ftok()。

功能:返回文件名对应的键值。

函数原型:key_t ftok(char *pathname,char proj)。

pathename:文件名      proj:项目名(一般不为0即可)

其余几个函数的语法要点如下:

根据以上,创建一个新的消息队列有两种情况,一种是没有与键值key相对应的消息队列,并且msgflg中包含了IPC_CREAT标志位,另一种是key参数为IPC_PRIVATE。

六、信号量

信号量主要用途是保护临界资源,进程可以根据它判断是否能够访问某些共享资源。除了用于访问控制外,还可以用于进程同步。

最简单的信号量是只能取0和1两种值,叫做二维信号量,类似于互斥锁。但是两者有不同:信号量强调共享资源,只要共享资源可用,其他进程同样可以修改信号量的值;互斥锁更强调进程,占用资源的进程使用完资源后,必须由进程本身来解锁。

计数信号量:信号量的值可以取任意非负值。

Linux系统中,信号量通常分为以下几个操作步骤:

1、创建信号量或者获得在系统已存在的信号量,需要调用semget()函数。不同进程通过使用同一个信号量键值来获得同一个信号量。

2、初始化信号量,使用semctl()函数的SETVAL操作,当使用二维信号量时,常初始化为1。

3、进行信号量的PV操作,调用semop()函数,这是实现进程同步和互斥的核心工作部分。

4、如果不需要信号量,要从系统中删除它,使用semctl()函数的IPC_RMID操作。

具体几个函数的语法要点如下:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值