信號量操作

簡介

應用程式創建信號量集需要調用semget(2)。系統中每個信號量集由一個semds_id數據結構描述,其中包括以下元素:
struct semid_ds {
struct ipc_perm sem_perm; /* operation permission struct */
struct sem *sem_base; /* ptr to first semaphore in set */
ushort_t sem_nsems; /* # of semaphores in set */
#if defined(_LP64)
time_t sem_otime; /* last semop time */
time_t sem_ctime; /* last change time */
#else /*_LP64*/
time_t sem_otime; /* last semop time */
int32_t sem_pad1; /* reserved for time_t expansion */
time_t sem_ctime; /* last change time */
int32_t sem_pad2; /* time_t expansion */
#endif /*_LP64*/
int sem_binary; /* flag indicating semaphore type */
long sem_pad3【3】; /* reserve area */
};
系統會對傳遞給semget(2)的關鍵字的值進行檢查來查看這個信號量是否已經存在了,並通過使用ipc支持例程ipcaccess()進行許可權檢查。信號量的許可權和我們在Solaris檔案中使用的許可權模式有點不同。這些許可權被定義程READ和ALTER,這樣進程就可以讀取當前信號量的值或者對該值進行修改(增大/減小)。這兩個許可權是通過傳遞給semget(2)調用的參數來建立的,它使用Solaris檔案許可權中通用的屬主、組和其他用戶的概念。

操作

假設有一個新的信號量,根據緊接的下一步操作就是對信號量值進行初始化。初始化操作使用semctl(2)調用來實現,它使用SETVAL來設定某個時間點上這個集合中每個信號量的值(或者這個集合中只用一個信號量,那么就設定這個信號量的值),或者使用SETALL來設定一個操作中該集合中所有信號量的值。核心的實際流程是明確的,它使用期望的許可權和值對可能的最大值進行檢查,如果所有的檢查都通過了,那么久設定用戶定義的值。
應用程式代碼對信號量的實際使用會調用semop(2)系統調用。semop(2)調用使用信號量的ID(由semget(2)返回)、一個指向sembuf結構的指針和信號量操作的個數作為參數。sembuf結構包含一下元素。
struct sembuf {
ushort_t sem_num; /* semaphore # */
short sem_op; /* semaphore operation */
short sem_flg; /* operation flags */
};
程式設計師必須創建sembuf結構並對其進行初始化,設定semaphore編號(說明它是集合中的哪一個信號量)、操作和標誌。sem_op的值決定了信號量操作是對信號量進行修改還是讀取這個信號量的值。非0的sem_op值可以增大信號量的值,也可以減小信號量的值。值為0的sem_op只是簡單的讀取信號量的值。

相關詞條

相關搜尋

熱門詞條

聯絡我們