歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Unix知識 >> Unix資訊 >> Unix信號量常用的操作

Unix信號量常用的操作

日期:2017/3/6 11:40:50   编辑:Unix資訊

我們知道系統調用semget用來把Unix信號量集合的鍵值譯成代表信號量集合的標識符,該集合中有count個元素,其存取權限定義與文件相同,由flags定義。若flags的IPC_CREAT位被置位,則當該集合不存在時系統就創建之。

因此各進程可都用置IPC_CREAT位的flags參數來獲取信號量集合的標識符,不需要由某一進程事先創建。若flags為IPC_PRIDVATE則不管同鍵值的Unix信號量集合是否存在系統都建立之,並返回下一個可用的標識符。

系統調用semctl在一組信號量上做各種控制操作,諸如Unix信號量集合的初始化、刪除和狀態查詢等。常用的操作及相關的命令格式如下:

①取消Unix信號量集合

  1. int semctl(sid,count,IPC_RMID,0)
  2. int sid; /*信號量集合標識符*/
  3. int count; /*信號量集合中元素個數*/

②設置信號量集合的初值(初始化)

Unix信號量集合剛建立時,各信號量的初值不確定,需要設定初值。初值的設定可用SETALL或SETVAL命令。若用SETALL命令,其格式為:

  1. int semctl(sid,count,SETALL,arg)
  2. int sid; /*信號量集合標識符*/
  3. int count; /*信號量集合中元素個數*/
  4. ushort *arg; /*命令參數*/

該命令把數組arg中的前count個值依次賦給集合中各信號量,一次可設定多個信號量的初值。
若用SETVAL命令,其格式為:

  1. int semctl(sid,semnum,SETVAL,arg)
  2. int sid; /*信號量集合標識符*/
  3. int semnum; /*信號量元素編號*/
  4. int arg; /*命令參數*/

該命令將arg的值賦給集合中第semnum個信號量,一次僅能設定一個信號量的初值。

③查詢Unix信號量集合的當前值

查詢信號量集合的當前值可用GETALL或GETVAL命令。若用GETALL命令,其格式為:

  1. int semctl(sid,count,GETALL,arg)
  2. int sid; /*信號量集合標識符*/
  3. int count; /*信號量集合中元素個數*/
  4. ushort *arg; /*命令參數*/

該命令把信號量集合中各信號量的當前值返回到數組arg中。

若用GETVAL命令,其格式為:

  1. int semctl(sid,semnum,GETVAL,0)
  2. int sid; /*信號量集合標識符*/
  3. int semnum; /*信號量元素編號*/

該命令把集合中第semnum個信號量的當前值作為調用的返回值。

④查詢某個Unix信號量的等待進程數

當一個進程要執行信號量操作時若條件不具備則被阻塞,有關信號量的等待進程數也相應變化。

通過GETNCNT命令可查詢等待信號量增值的進程數,其格式如下:

  1. int semctl(sid,semnum,GETNCNT,0)
  2. int sid; /*信號量集合標識符*/
  3. int semnum; /*信號量元素編號*/

該命令把等待第semnum個信號量增值的進程數作為調用的返回值。

通過GETZCNT命令可查詢等待信號量值為0的進程數,其格式如下:

  1. int semctl(sid,semnum,GETZCNT,0)
  2. int sid; /*信號量集合標識符*/
  3. int semnum; /*信號量元素編號*/

該命令把等待第semnum個信號量值為0的進程數作為調用的返回值。

關於Unix信號量的介紹,我們就到這裡了,至於其它的控制命令,因不常用而不再累述。

Copyright © Linux教程網 All Rights Reserved