技術 > 信號量操作
  應用程序創建信號量集需要調用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; /* 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衹是簡單的讀取信號量的值。