System V 共享記憶體允許多進程映射同一實體記憶體區域,實現最高效 IPC。本文提供三個完整 C 範例:基本建立/刪除、掛載讀寫、信號量同步生產者/消費者模型。
| 函數 | 功能 |
|---|---|
shmget() | 建立/取得共享記憶體段,回傳 shmid |
shmat() | 掛載至進程虛擬位址空間,回傳指標 |
shmdt() | 分離掛載 |
shmctl() | 控制:IPC_STAT 狀態、IPC_RMID 刪除、SHM_LOCK 鎖定實體頁 |
#include <sys/ipc.h>, <sys/shm.h>, <stdio.h>
#define MY_SHM_ID 67483
int main() {
int shmid = shmget(MY_SHM_ID, 4096, 0666 | IPC_CREAT);
struct shmid_ds ds; shmctl(shmid, IPC_STAT, &ds);
printf("Size=%ld, Attaches=%ld\n", ds.shm_segsz, ds.shm_nattch);
shmctl(shmid, IPC_RMID, 0); // 標記刪除,最後一個分離時實際移除
return 0;
}
void *mem = shmat(shmid, 0, 0);
strcpy((char*)mem, "Hello SHM");
printf("%s\n", (char*)mem);
shmdt(mem);
結構體包含計數器、緩衝區、信號量 ID。semop 操作 sem_num=0,sem_op=-1 (P 操作/等待)、sem_op=+1 (V 操作/釋放)。
// 關鍵區段 sb.sem_op = -1; semop(semid, &sb, 1); // 等待 buffer[counter++] = my_char; // 寫入共享記憶體 sb.sem_op = +1; semop(semid, &sb, 1); // 釋放
gcc -Wall shm_demo.c -o shm_demo ./shm_demo create ./shm_demo use a & ./shm_demo use b & ./shm_demo read ./shm_demo remove
getpagesize())。shmdt()。SHM_LOCK 可鎖定實體頁防止換出,提升即時性能。掌握 System V IPC 三件套 (共享記憶體、信號量、訊息佇列),即可構建高效能多進程協作系統。