通过共享内存和信号量实现进程间的通信

一:共享内存相关概念和使用函数:
共享内存是在多个进程之间共享和传递数据的一种方式。它允许两个不相关的进程访问同一个逻辑内存,共享内存是在两个正在运行的进程之间传递数据的一种非常有效的方式。
   共享内存是由IPC为进程创建的一个特殊的地址范围,它将出现在该进程的地址空间中。其他进程可以将同一段共享内存连接到他们自己的地址空间中。所有进程都可以访问共享内存的地址。如果一个进程向共享内存写入了数据,所做的改动将立刻被可以访问同一段共享内存的任何其他进程看到。
共享内存的函数:
#include <sys/shm.h>
(1) shmget函数:
int shmget(key_t key,  size_t size, int shmflg);
此函数的功能是创建共享内存。
第一个参数是程序需要提供一个参数key,它有效的为共享内存命名。
第二个参数size是以字节为单位指定需要共享的内存容量。
第三个参数是包含九个bit的权限标志,它们的作用与创建文件时使用的mode一样,由IPC_CREAT定义的一个特殊比特必须和权限标志按位或才能创建一个新的共享内存段。(权限标志对共享内存十分有用,因为它们允许一个进程创建的共享内存可以被共享内存的创立者所拥有的进程写入,同时其他用户创建的进程只能读取该共享内存)。
    shmget函数返回一个共享内存的标示符,该标示符将用于后续的共享内存函数。如果创建失败,则返回-1。
   (2)shmat函数:
    void *shmat(int shm_id,const void *shm_addr,int shmflg);
    此函数的作用是将共享内存连接到一个进程的地址空间中。
    第一个参数是由shmget返回的共享内存标示符。
第二个参数是共享内存连接到当前进程中的地址位置,它通常是一个空指针,表示
让系统来选择共享内存出现的地址。
第三个参数是一组位标志,它有两种取值:SHM_RND(此标志与shm_addr联合使用,用来控制共享内存的地址),SHM_RDONLY(表示连接的内存只读)。
(3)shmdt函数
shmdt函数的作用是将共享内存从当前的进程中分离,它的参数是shmat返回的地址指针,成功后返回0,否则返回-1。(将共享内存分离并未删除它,只是使得该共享内存对当前的进程不在可用)
(4)shmctl函数
int shmctl(int shm_id ,int command, struct shmid_ds *buf)
第一个参数是shmget返回的共享内存的标示符。
第二个参数是command是要采取的动作,它有三种值:IPC_STAT(把shmid_ds结构中的数据设置为共享内存的当前关联值),IPC_SET(如果进程有足够的权限,就把共享内存的当前关联值设置为shmid_ds结构中给出的值),IPC_RMID(删除共享内存段)
第三个参数是一个指针,它指向包含共享内存模式和访问权限的结构。
函数执行成功后返回0,失败时返回-1。
二:示例程序
    程序的目的是让两个进程都能访问到一块内存空间,当一个进程对该空间的数据修改后,另一个进程也能及时同步该空间的数据。代码如下所示:
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值