首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Linux semget(key, 0, 0) 參數詳解:獲取現有信號量而非創建

     編輯:程式設計綜合問答

函數原型

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**,即不創建、不排他。僅嘗試訪問已存在集合,需調用進程有讀權限。

semget(key, 0, 0) 整體語義

「嘗試獲取鍵為 key 的現有信號量集標識符,不創建,不指定信號量數量,失敗返回 -1。」

常用於**多進程協作**中「消費者」端:生產者先用 semget(key, 1, IPC_CREAT|0666) 創建,消費者用 semget(key, 0, 0) 獲取同一集合進行 P/V 操作。

返回值與錯誤碼

  • 成功:返回非負整數標識符(semid),後續 semop、semctl 使用。
  • 失敗:返回 -1,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 的創建端使用,實現進程間同步。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved