Linux进程间通信(下)

本文深入探讨了进程间通信的三种主要机制:共享内存、消息队列和信号量。详细介绍了它们的工作原理、接口函数以及代码实现,展示了如何创建、使用和删除这些通信资源。通过实例代码,演示了如何利用共享内存进行读写操作,以及消息队列的消息发送与接收。此外,还阐述了信号量在确保资源互斥访问和同步中的作用。

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

目录

共享内存

共享内存原理

共享内存接口

1.shmget

2.shmat

 3.shmdt

4.shmid

 代码验证

共享内存特性

 消息队列

消息队列原理

消息队列接口

1.msgget

 2.msgsnd

 3.msgrcv

4.msgctl

 代码验证

信号量


共享内存

共享内存原理

1.在物理内存中开辟一段空间

2.不同的进程通过页表将物理内存空间映射到自己的进程虚拟地址空间中

3.不同的进程通过操作自己进程虚拟地址空间中的虚拟地址,来操作共享内存

如下图所示:

共享内存接口

1.shmget

功能:创建或获取共享内存,具体用法如下:

2.shmat

功能:将共享内存添加到进程虚拟地址空间,用法如下:

 3.shmdt

功能:分离共享内存

4.shmid

功能:获取或者修改共享内存属性信息,以及删除共享内存。

 代码验证

给出两端代码,左侧代码的功能是创建共享内存,并往共享内存中写。右侧代码的功能是获取共享内存,并从共享内存中将内容读出来。如下图所示:

打印出来结果,说明使用共享内存进行进程间通信成功。 

共享内存特性

1.共享内存生命周期跟随操作系统。在以上的代码中,我们创建了标识符为:"0x34343434"的共享内存,通过命令:"ipcs",可以查看共享内存,如下,此时附加共享内存的进程数量为0,但是共享内存依然存在。

 2.共享内存是覆盖写的,读的时候,访问的是地址。

3.共享内存的删除特性

共享内存可以使用函数或者命令来删除,如下代码中使用函数删除共享内存:

  1 #include <stdio.h>
  2 #include <sys/shm.h>
  3 #include <unistd.h>
  4 int main(){
  5     int shm_id=shmget(0x56565656,1024,IPC_CREAT|0664);
  6     if(shm_id<0){
  7         perror("shmget");
  8         return 0;
  9     }
 10     int count=20;
 11     while(count){//睡眠20秒                                                                           
 12         sleep(1);
 13         count--;
 14     }
 15     shmctl(shm_id,IPC_RMID,NULL);
 16     return 0;
 17 }

编译运行后:

 根据以上现象,成功使用函数删除了共享内存。

使用命令"ipcrm -m [共享内存操作句柄]"也可以删除共享内存:

 删除特性:

 消息队列

消息队列原理

1、消息队列采用链表来实现,该链表由系统内核来维护

2、系统中可能会有很多的消息队列,每个消息队列用消息队列描述符(消息队列id - qid)来区分,qid是唯一的,用来区分不同的消息队列。

3、在进行进程间通信的时候,一个进程将消息追加到消息队列的尾端,另一个进程从消息队列里取数据(不一定按照先进先出的原则取数据,也可以按照消息类型字段来取)。

消息队列接口

1.msgget

功能:创建消息队列

 2.msgsnd

功能:发送消息

 3.msgrcv

功能:接收消息 

4.msgctl

功能:操作消息队列

 代码验证

以下代码中,左边代码创建消息队列,并且往消息队列中发送消息,右边代码获取消息队列,并且从消息队列读出消息。观察运行结果,进程间通信成功。

另外,删除消息队列可用命令"ipcrm -q [msqid]"进行删除。

信号量

1.由于各进程要求共享资源,而且有些资源需要互斥使用,因此各进程间竞争使用这些资源,进程的这种 关系为进程的互斥
2.系统中某些资源一次只允许一个进程使用,称这样的资源为临界资源或互斥资源。
3.在进程中涉及到互斥资源的程序段叫临界区

4.信号量本质是资源计数器,能够保证多个进程访问临界资源,执行临界区代码的时候,互斥访问,同时也可以用于同步。
如何保证?
通过信号量的值来保证,每个进程需要先获取信号量,只有获取到信号量才可以访问临界资源,如果获取失败,则阻塞等待,同步是指临界资源空闲之后,通知等待的进程进行访问。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值