在多进程编程中,C语言共享内存是一种非常高效的进程间通信(IPC)方式。相比管道、消息队列等机制,共享内存允许两个或多个进程直接访问同一块物理内存区域,避免了数据拷贝的开销,因此性能极高。本文将从零开始,用通俗易懂的方式带你掌握共享内存的基本原理和使用方法,即使你是编程小白也能轻松上手!

共享内存是操作系统提供的一种机制,允许多个进程将同一段物理内存映射到各自的虚拟地址空间中。这样一来,一个进程写入的数据,另一个进程可以直接读取,无需通过内核中转,大大提升了通信效率。
在Linux系统中,共享内存属于System V IPC机制的一部分,主要通过以下系统调用实现:
shmget():创建或获取一个共享内存段shmat():将共享内存段附加到当前进程地址空间shmdt():将共享内存段从当前进程分离shmctl():控制共享内存段(如删除)这是使用共享内存的第一步。它用于创建一个新的共享内存段,或者获取一个已存在的共享内存标识符。
#include <sys/ipc.h>#include <sys/shm.h>int shmget(key_t key, size_t size, int shmflg);key:唯一标识符,通常用 ftok() 生成size:共享内存大小(字节)shmflg:权限标志,如 IPC_CREAT | 0666将共享内存段“挂载”到当前进程的地址空间,返回一个指向该内存的指针。
void *shmat(int shmid, const void *shmaddr, int shmflg);通常我们传入 NULL 作为第二个参数,让系统自动选择映射地址。
下面是一个完整的 C 程序,演示如何使用 shmget函数 创建共享内存,并让父进程写入数据、子进程读取数据。
#include <stdio.h>#include <sys/ipc.h>#include <sys/shm.h>#include <string.h>#include <unistd.h>#include <wait.h>#define SHM_SIZE 1024int main() { key_t key = ftok("shmfile", 65); // 生成唯一key int shmid = shmget(key, SHM_SIZE, 0666 | IPC_CREAT); if (shmid == -1) { perror("shmget failed"); return 1; } char *data = (char *)shmat(shmid, NULL, 0); if (data == (char *)(-1)) { perror("shmat failed"); return 1; } pid_t pid = fork(); if (pid == 0) { // 子进程:读取共享内存 sleep(1); // 等待父进程写入 printf("Child reads: %s\n", data); shmdt(data); // 分离 } else if (pid > 0) { // 父进程:写入共享内存 strcpy(data, "Hello from parent via shared memory!"); printf("Parent wrote message to shared memory.\n"); wait(NULL); // 等待子进程结束 shmdt(data); // 分离 shmctl(shmid, IPC_RMID, NULL); // 删除共享内存段 } else { perror("fork failed"); return 1; } return 0;}编译并运行:
gcc shared_memory_demo.c -o demo./demoshmdt() 分离共享内存,否则可能导致资源泄漏。shmctl(shmid, IPC_RMID, NULL) 删除共享内存段,避免系统中残留无用段。通过本教程,你已经掌握了 C语言共享内存 的基本使用方法,理解了 进程间通信 的核心思想,并学会了如何使用 shmget函数 创建共享内存段。共享内存是高性能 IPC 的首选方案,尤其适合需要频繁交换大量数据的场景。希望你能将所学应用到实际项目中,提升程序效率!
关键词回顾:C语言共享内存、进程间通信、shmget函数、共享内存编程
本文由主机测评网于2025-12-03发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025122582.html