int semget(key_t key, int nsems, int semflg);
| 參數 | 傳值 0 時的含義 |
|---|---|
key | 鍵值(由 ftok 生成或約定),標識信號量集。0 通常為 IPC_PRIVATE(僅當前進程樹可見),但此處傳入具體 key 而非 0。 |
nsems | 信號量個數。傳 0 表示**不創建新集合**,僅獲取現有集合的標識符。若集合不存在返回 -1 (ENOENT)。 |
semflg | 標誌位。傳 0 表示**不設置 IPC_CREAT / IPC_EXCL**,即不創建、不排他。僅嘗試訪問已存在集合,需調用進程有讀權限。 |
「嘗試獲取鍵為 key 的現有信號量集標識符,不創建,不指定信號量數量,失敗返回 -1。」
常用於**多進程協作**中「消費者」端:生產者先用 semget(key, 1, IPC_CREAT|0666) 創建,消費者用 semget(key, 0, 0) 獲取同一集合進行 P/V 操作。
semid),後續 semop、semctl 使用。errno 可能為:
ENOENT:信號量集不存在(未創建或已刪除)。EACCES:權限不足。EINVAL:key 無效或現有集合信號量數與 nsems 不符(此處 nsems=0 不檢查)。// 生產者
int semid = semget(0x1234, 1, IPC_CREAT | 0666);
semctl(semid, 0, SETVAL, 1); // 初始化為 1
// 消費者
int semid = semget(0x1234, 0, 0); // 僅獲取
struct sembuf p = {0, -1, 0};
semop(semid, &p, 1); // P 操作
// 臨界區
struct sembuf v = {0, 1, 0};
semop(semid, &v, 1); // V 操作
semget(key, 0, 0) 是**獲取現有信號量集**的標準調用,**不創建、不指定數量、無標誌位**。配合 IPC_CREAT 的創建端使用,實現進程間同步。