Linux进程通信之共享内存与信号量

本文详细介绍了Linux中的共享内存和信号量,包括原理、创建方法、关键函数如shmget、ftok、shmat、shmctl的应用,以及如何通过信号量实现临界区的互斥访问和原子性操作,以确保进程间通信的正确性和同步性。
摘要由CSDN通过智能技术生成

(。・∀・)ノ゙嗨!你好这里是ky233的主页:这里是ky233的主页,欢迎光临~icon-default.png?t=N7T8https://blog.csdn.net/ky233?type=blog

点个关注不迷路⌯'▾'⌯

目录

一、共享内存

1.原理

2.建立

3.shmget和ftok

4.ftok的用法

5.shmctl的用法

6.shmat的用法

7.通信代码

8.结论

9.用管道来帮助共享内存进行访问控制

二、信号量

1.临界资源、临界区、互斥

2.原子性


一、共享内存

1.原理

共享内存顾名思义,就是在内存中堆区和栈区相对,中间还有一个共享内存区,两个进程同时访问,即可完成进程之间的通信!

这里要注意!

我们开辟的共享内存是在虚拟内存上开辟然后在,然后映射到真是的物理内存的,所以双方要进行进程通信直接用内存级别的读写就可以了,这是在堆栈之间开辟的,无需经过系统调用,而管道本质上还是经过文件,这是要有对应的内核数据结构,所以管道要用操作系统来调用! 

2.建立

首先共享内存的提供者是操作系统,共享内存也是要经过OS管理的还是经过先描述在组织

所以共享内存=共享内存块+对应的共享内存的内核数据结构

3.shmget和ftok

int shmget(key_t key,size_t size,int shmflg)
  • 参数1:两个进程只要是同一个key就可以看到同一个共享内存
  • 参数2:需要的共享内存有多大
  • 参数3:两个选项,IPC_CREAT(创建内存,如果底层已经存在,就直接获取并返回),IPC_EXCL(单独使用无意义,合起来使用如果底层不存在,则创建并返回,如存在则出错返回,则一定创建一个全新的共享内存)
  • 返回值:类似于fd
key_t ftok(const char *pathname,int proi id)

用此函数来形成key值

  • 参数1:路径
  • 参数2:0~255的任意数

只要两个进程使用同样的pathname,和id那么就会生成唯一key

4.ftok的用法

Server:

int main()
{
    key_t k = ftok(PATH_NAME,PROJ_ID);
    Log("create key done",Debug)<<"server key:"<<k<<endl;
    return 0;
}

Client: 

int main()
{
    key_t k = ftok(PATH_NAME,PROJ_ID);
    Log("create key done",Debug)<<"client key:"<<k<<endl;
    return 0;
}

 由此我们可以看见两个进程获取的是同一个key值,而且是一个随机值

5.shmctl的用法

当进程运行结束,我们的共享内存还存在!system V IPC资源的生命周期是随我们内核的!

要想删除两种办法

  • 1:手动删除
  • 2:代码删除

手动删除太麻烦,所以我们可以用shmctl来删除

int shmctl(int shmid,int cmd,struct shmid_ds *buf)
  • 参数一:就是shmget创建的id
  • 参数二:设置一些属性,如删除
  • 参数三:今天我们只是删除,所以设为空即可

6.shmat的用法

我们创建完共享内存之后需要挂接到我们需要的进程的地址空间中,所以我们用这个函数

void *shmat(int shmid,const void *shmaddr,int shmflg)
  •  参数一:对应共享内存的id
  • 参数二:所要指定的虚拟地址,但一般不建议自己设置一般设为nullptr
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值