Linux基础:共享内存和消息队列

信号量:PV操作,对进程进行同步。

共享内存

正常情况下,将一块物理内存分配给A进程,是不能够同时分配给B进程(一个物理进程只能属于某一个进程)。两个进程是相互独立,A进程结束,释放内存,不会影响其他进程。
如何将同一个物理空间映射到不同的逻辑地址空间?
执行代码ipcs,显示消息队列,共享内存和信号量
如果仅仅想看共享内存,则执行代码:ipcs -m

创建共享内存空间,代码如下:
我们可以发现,共享内存空间已经创建完成,运行结果如下:

手动移除内存空间代码:ipcrm -m 28

共享内存创建成功之后,该如何使用呢?在共享内存中存入字符hello,代码如下:


从上面的运行结果可以发现:hello已经成功写入,接下来用test.c 进程打印,代码如下:
运行结果:
test.c能够读取到main.c中写入的hello,即可说明这两个进程访问的是同一块物理内存空间。

能否做到像管道一样,循环写入数据,并循环读取呢?代码如下:

运行结果:

如何做到输入一次数据,读取一次,当没有写入数据时,则不写入数据。下面将用信号量来解决这个问题。具体代码如下:


将上面的程序直接用在main.c和test.c程序中。即可让main输入一次数据,test输出一次数据。

在程序main.c中,仅仅增加了第20行的初始化,第26行的p操作以及第28行的v操作。test.c的代码如下:
在test.c中,仅仅增加了第19行的初始化,第22行的p操作,第28行的v操作以及第31行的销毁操作。

消息队列:

执行代码ipcs,显示消息队列,共享内存和信号量
如果仅仅想看共享内存,则执行代码:ipcs -s

在a程序中添加消息,具体代码如下:

添加消息后,运行一次的结果为:
运行两次的结果为:

在b程序中读取消息,具体代码如下:

运行结果:

原来是两个消息,运行b.c读取,运行一次则表示读取一个消息,以此类推。
将b.c中的读取消息类型的第20行改为0,则表示可以读取任意类型的消息;

运行结果:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值