一个使用共享内存进行进程间通信的程序,主要功能是创建并读取共享内存中的数据。具体作用如下:
#include <stdio.h> // 包含标准输入输出库
#include <sys/ipc.h> // 包含IPC(进程间通信)相关函数定义
#include <sys/shm.h> // 包含共享内存相关函数定义
#include <sys/types.h> // 包含基本系统数据类型定义
#include <string.h> // 补充字符串处理函数库(原代码使用了strncmp)int main()
{// 1、获取key值key_t key = ftok(".", 10); // 生成唯一key值,当前目录和10作为参数// 2、根据key值获取共享内存的ID号int shmid = shmget(key, 1024, IPC_CREAT | 0666); // 创建/获取共享内存,大小1024字节,权限0666// 3、将共享内存映射至本进程虚拟内存空间char *shm_p = shmat(shmid, NULL, 0); // 映射共享内存到当前进程地址空间,返回映射地址// 检查映射是否成功if (shm_p == (void *)-1){perror("shmat error"); // 映射失败时输出错误信息return -1; // 映射失败,程序退出}// 循环读取共享内存数据while (1){// 从共享内存中读取数据并打印printf("recv: %s\n", shm_p); // 打印共享内存中的数据sleep(1); // 休眠1秒,降低CPU占用// 检查退出条件(比较前4个字符是否为"exit")if (strncmp(shm_p, "exit", 4) == 0)break; // 如果是退出指令,则跳出循环}return 0; // 程序正常结束
}
创建共享内存:
- 通过
ftok()
生成一个唯一的 key 值,作为共享内存的标识 - 使用
shmget()
创建或获取共享内存段,大小为 1024 字节 - 通过
shmat()
将共享内存映射到当前进程的地址空间
- 通过
读取共享内存数据:
- 进入无限循环,不断从共享内存中读取数据并打印
- 每读取一次数据后休眠 1 秒,降低系统资源占用
退出机制:
- 当从共享内存中读取到以 "exit" 开头的数据时,退出循环并结束程序
这个程序通常需要配合另一个写入共享内存的程序使用,两个进程通过共享同一块内存区域实现数据交换,这是 Linux 系统中进程间通信 (IPC) 的一种常用方式。共享内存是效率最高的 IPC 方式,因为数据不需要在进程间复制,而是直接访问同一块内存区域。