semget()
建立一個新的訊號量集,或者使用一個已經存在的訊號量集。
系統調用:semget();
原型:int semget(key_t key, int nsems, int semflg);
參數:第一個參數是關鍵字值(一般是由系統調用ftok()返回的)。
第二個參數nsems指出一個新的訊號量集合中應該建立的訊號量的個數。可以將訊號量集合理解為數組,長度為nsems。最大個數定義在linux/sem.h,我的ubuntu8中最大個數為250
傳回值:如果成功,則返回訊號量集的IPC標識符。如果失敗,則返回-1。
errno不再描述。
semop()
訊號量操作
調用原型:int semop(int semid, struct sembuf *sops,unsigned nsops);
參數:第一個參數是關鍵字值,由semget返回得來。第二個參數是指向將要操作的數組的指標。第三個參數是數組中的操作的個數。nsops為數組sops的大小。
第二個參數結構體如下:
struct sembuf {
unsigned short sem_num; /* 使用第sem_num個訊號量 */
short sem_op; /* 訊號量操作 */
short sem_flg; /* 操作標誌 */
};
sem_num對應訊號集中的號誌,0對應第一個號誌。sem_flg可取IPC_NOWAIT以及SEM_UNDO兩個標誌。如果設定了SEM_UNDO標誌,那麼在進程結束時,相應的操作將被取消,這是比較重要的一個標誌位。如果設定了該標誌位,那麼在進程沒有釋放共用資源就退出時,核心將代為釋放。sem_op的值大於0,等於0以及小於0確定了對sem_num指定的號誌進行的三種操作。
sem_op>0:相應進程要釋放sem_op數目的共用資源;
sem_op=0:用於對共用資源是否已用完的測試;
sem_op<0:進程要申請-sem_op個共用資源。
個人理解:某進程要使用某資源時,先判斷sem_op是否為0,然後設定sem_op>0,使用完後sem_op<0。
傳回值:0,成功。-1,失敗。
errno不再描述。
semctl()
實現對號誌的各種控制操作。
系統調用:semctl();
原型:int semctl(int semid, int semnum, int cmd, union semunarg);
參數:
參數semid指定號誌集,參數semnum指定對哪個號誌操作,參數cmd指定具體的操作類型,只對幾個特殊的cmd操作有意義;semunarg用於設定或返回號誌資訊,代表一個semun執行個體,該參數可以忽略。
參數cmd中可以使用的命令如下:
·IPC_STAT讀取一個訊號量集的資料結構semid_ds,並將其儲存在semun中的buf參數中。
·IPC_SET設定訊號量集的資料結構semid_ds中的元素ipc_perm,其值取自semun中的buf參數。
·IPC_RMID將訊號量集從記憶體中刪除。
·GETALL用於讀取訊號量集中的所有訊號量的值。
·GETNCNT返回正在等待資源的進程數目。
·GETPID返回最後一個執行semop操作的進程的PID。
·GETVAL返回訊號量集中的一個單個的訊號量的值。
·GETZCNT返回這在等待完全閒置資源的進程數目。
·SETALL設定訊號量集中的所有的訊號量的值。
·SETVAL設定訊號量集中的一個單獨的訊號量的值。
傳回值:如果成功,則為一個正數。