Unix信號量(SEMAPHORE)則是防止兩個或多個進程同時訪問共享資源的一種機制。在Unix信號量機制實現之前,通常采用加鎖文件的方法。信號量(Semaphore),有時被稱為信號燈,是在多線程環境下使用的一種設施,是可以用來保證兩個或多個關鍵代碼段不被並發調用。在進入一個關鍵代碼段之前,線程必須獲取一個信號量;一旦該關鍵代碼段完成了,那麼該線程必須釋放信號量。
其它想進入該關鍵代碼段的線程必須等待直到第一個線程釋放信號量。為了完成這個過程,需要創建一個信號量VI,然後將Acquire Semaphore VI以及Release Semaphore VI分別放置在每個關鍵代碼段的首末端。確認這些信號量VI引用的是初始創建的信號量。UNIXSYSTEMV以一個長整數的鍵值作為Unix信號量集合的唯一標識,Unix信號量通常由下列元素組成:
①信號量的值
②操作該信號量的最後一個進程的進程標識
③等待增加該信號量的值的進程數
④等待該信號量的值為0的進程數
與之有關的系統調用如下:
- #include <sys/types.h>
- #include <sys/ipc.h>
- #include <sys/sem.h>
- int semget(key,count,flags)
- /*獲取信號量集合的標識符*/
- key_tkey; /*信號量集合的鍵*/
- intcount; /*信號量集合中元素個數*/
- intflags; /*任選參數*/
- /*返回信號量集合標識符,若出錯則返回-1*/
- int semop(sid,ops,nops) /*信號量操作*/
- int sid; /*信號量集合標識符*/
- struct sembuf *ops; /*信號量操作結構的指針*/
- intnops; /*信號量操作結構的個數*/
- /*返回運算完成前該組信號量中最後一個被運算的信號量的
- 值,若出錯則返回-1*/
- int semctl(sid,semnum,cmd,arg)
- /*控制信號量操作*/
- intsid; /*信號量集合標識符*/
- intsemnum; /*信號量元素編號*/
- intcmd; /*控制命令*/
- union semun{
- intval;
- struct semid_ds *buf;
- ushort*array;} arg; /*命令參數*/
Unix信號量元素組成部分我們就講解到這裡了。