使用shmget在进程共享内存

本文深入解析Linux进程间通信中共享内存的实现原理及应用。详细介绍了shmget、shmat、shmdt、shmctl等核心函数的功能与用法,特别强调了shmget函数在创建共享内存对象中的关键作用。同时,文章提供了内核配置需求,确保共享内存功能正常启用,避免运行时错误。

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

用于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

### 创建共享内存的C语言示例 为了创建并访问共享内存,在C程序中通常会使用`ftok()`来生成键值,接着利用此键通过`shmget()`获取或创建一个共享内存段,最后调用`shmat()`将该段附加到当前进程中。 #### 使用 `ftok()`, `shmget()`, 和 `shmat()` 的具体实现如下: ```c #include <stdio.h> #include <stdlib.h> #include <sys/ipc.h> /* ftok */ #include <sys/shm.h> /* shmget, shmat */ #define SHM_KEY_PATH "/tmp" #define PROJ_ID 'A' int main() { key_t key; int shmid; char *data; // Generate a unique key for IPC objects. if ((key = ftok(SHM_KEY_PATH, PROJ_ID)) == -1) { perror("Failed to generate key"); exit(EXIT_FAILURE); } // Create or get an existing shared memory segment associated with the key. if ((shmid = shmget(key, 1024, 0644 | IPC_CREAT)) == -1) { perror("Shared memory creation failed"); exit(EXIT_FAILURE); } // Attach the shared memory segment to this process's address space. data = (char*)shmat(shmid, NULL, 0); if(data == (char *)(-1)){ perror("Attach operation failed"); exit(EXIT_FAILURE); } printf("Data attached at %p\n", data); strcpy(data,"Hello Shared Memory"); // Detach from shared memory when done. if(shmdt(data)==-1){ perror("Detach operation failed"); exit(EXIT_FAILURE); } return 0; } ``` 上述代码展示了如何初始化共享内存区,并向其中写入字符串。这里需要注意的是,当完成对共享内存的操作之后应当显式地将其分离[^1]。 #### 关于共享内存管理的一些注意事项 - 当多个进程需要通信时可以共同访问同一块由`shmget()`返回ID所代表的共享内存区域。 - 如果指定了`(void *)0`作为第二个参数传递给`shmat()`函数,则操作系统会选择合适的地址空间位置来进行映射;这通常是推荐的做法除非有特殊需求。 - 对于不再使用共享内存应该及时销毁它以释放资源,可以通过`shmctl()`接口指定删除操作来达到目的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值