在Linux开发中,进程间通信(IPC)是不可或缺的核心技术。SystemV IPC提供了三种高效通信方式:共享内存、消息队列和信号量。其中,SystemV共享内存因极低的延迟和零拷贝特性,成为大数据量交换的首选方案。本文将手把手带你掌握这一利器。
共享内存是多个进程直接访问同一块物理内存的机制。与管道、消息队列不同,它无需内核中转,数据直接在用户空间读写,因此速度极快。SystemV共享内存是最经典的实现,通过唯一标识符(shmid)管理。
四个函数构成整个编程模型(均定义在sys/shm.h):
shmget() —— 创建或获取共享内存标识符。参数:键值、大小、权限标志。返回shmid。shmat() —— 将共享内存映射到进程地址空间。返回映射地址指针。shmdt() —— 分离共享内存(解除映射)。shmctl() —— 控制操作(删除、查询状态等)。其中,shmget是第一个调用的函数,它的键(key)既可以通过ftok()生成,也可使用IPC_PRIVATE创建私有共享内存。
下面通过完整示例展示两个进程通过SystemV共享内存通信。进程A写入“Hello,共享内存”,进程B读取并打印。
#include #include #include int main() { key_t key = ftok("/tmp", 66); // 生成唯一键 int shmid = shmget(key, 1024, IPC_CREAT | 0666); // 创建1KB共享内存 char str = (char) shmat(shmid, NULL, 0); // 映射 strcpy(str, "Hello,共享内存!"); // 写入数据 printf("进程A写入: %s", str); shmdt(str); // 分离 return 0;} #include #include int main() { key_t key = ftok("/tmp", 66); int shmid = shmget(key, 1024, 0666); // 获取已存在的共享内存 char str = (char) shmat(shmid, NULL, 0); printf("进程B读到: %s", str); // 读取数据 shmdt(str); shmctl(shmid, IPC_RMID, NULL); // 删除共享内存 return 0;} 编译运行两个程序,可以看到进程B正确输出进程A写入的内容。注意:shmctl使用IPC_RMID标记删除,当所有进程detach后物理内存才会被释放。
共享内存本身不提供互斥机制!当多个进程同时写,会出现数据错乱。通常结合SystemV信号量或pthread_mutex(需放在共享内存中)来保证同步。这也是进程间通信课程中的重点难点。
终端输入:
ipcs -m # 查看当前共享内存段ipcrm -m shmid # 手动删除共享内存 通过本文,你已经掌握了SystemV共享内存的核心概念、4个关键函数、完整编程流程以及同步必要性。相比其他IPC,共享内存效率最高,但需小心并发控制。接下来可以进一步学习POSIX共享内存,它们原理相通。
—— 教程结束,动手实践是巩固知识的最佳途径!——
本文由主机测评网于2026-02-13发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://vpshk.cn/20260225053.html