使用shmget在进程共享内存

用于Linux进程通信(IPC Inter-Process-Communication)中,共享内存作为一种方便而且有效的手段, 我们在程序中经常看到。其中共享内存函数由shmget、shmat、shmdt、shmctl四个函数组成,其中shmget用来创建一个共享内存对象。

       #include <sys/ipc.h>
       #include <sys/shm.h>
       int shmget(key_t key, size_t size, int shmflg);
key: 标识符的规则, size:共享存储段的字节数, flag:读写的权限
返回值:成功返回共享存储的id,失败返回-1

使用之前在内核中要使能IP C, 如下几个选项必须要使能:

  CONFIG_SYSVIPC=y
  CONFIG_SYSVIPC_SYSCTL=y

要不, 在程序运行中会有如下的出错信息:

Unable to get shared memory segment(shmget)
shmid = -1, size = 32, size1 = 8192, Error 38

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在子进程中读取共享内存,需要先使用`shmat()`函数将共享内存区域映射到子进程的地址空间中,然后再进行读取操作。 具体步骤如下: 1. 使用`shmget()`函数获取共享内存标识符。 2. 使用`shmat()`函数将共享内存区域映射到子进程的地址空间中,并返回指向共享内存区域的指针。 3. 读取共享内存区域中的数据。 4. 使用`shmdt()`函数将共享内存区域从子进程的地址空间中解除映射。 下面是一个示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <sys/ipc.h> #include <sys/shm.h> #define SHM_SIZE 100 int main() { int shmid; char *shm_ptr; // 获取共享内存标识符 if ((shmid = shmget(IPC_PRIVATE, SHM_SIZE, IPC_CREAT | 0666)) < 0) { perror("shmget"); exit(1); } // 映射共享内存区域到子进程的地址空间中 if ((shm_ptr = shmat(shmid, NULL, 0)) == (char *) -1) { perror("shmat"); exit(1); } // 读取共享内存区域中的数据 printf("Shared memory content: %s\n", shm_ptr); // 解除共享内存区域的映射 if (shmdt(shm_ptr) == -1) { perror("shmdt"); exit(1); } // 删除共享内存区域 if (shmctl(shmid, IPC_RMID, NULL) == -1) { perror("shmctl"); exit(1); } return 0; } ``` 在示例代码中,我们首先使用`shmget()`函数获取了一个共享内存标识符,然后使用`shmat()`函数将共享内存区域映射到子进程的地址空间中,接着读取了共享内存区域中的数据,最后使用`shmdt()`函数将共享内存区域从子进程的地址空间中解除映射,以及使用`shmctl()`函数删除共享内存区域。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值