Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

Linux 共享記憶體 (shm) 程式設計完整範例:shmget/shmat/shmdt/shmctl 與信號量同步

編輯:Linux 教學

System V 共享記憶體允許多進程映射同一實體記憶體區域,實現最高效 IPC。本文提供三個完整 C 範例:基本建立/刪除、掛載讀寫、信號量同步生產者/消費者模型。

核心 API 對照

函數功能
shmget()建立/取得共享記憶體段,回傳 shmid
shmat()掛載至進程虛擬位址空間,回傳指標
shmdt()分離掛載
shmctl()控制:IPC_STAT 狀態、IPC_RMID 刪除、SHM_LOCK 鎖定實體頁

範例 1:建立、查詢、刪除

#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;
}

範例 2:掛載、寫入、讀取、分離

void *mem = shmat(shmid, 0, 0);
strcpy((char*)mem, "Hello SHM");
printf("%s\n", (char*)mem);
shmdt(mem);

範例 3:信號量同步多進程寫入 (生產者/消費者)

結構體包含計數器、緩衝區、信號量 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 可鎖定實體頁防止換出,提升即時性能。
  • IPC 物件生命週期隨核心,重開機消失;持久化需自行落盤。

掌握 System V IPC 三件套 (共享記憶體、信號量、訊息佇列),即可構建高效能多進程協作系統。

Copyright © Windows教程網 All Rights Reserved