Linux C 訊號 訊號量

2022-07-21 06:33:09 字數 2645 閱讀 7593

july 10, 2020 12:49 am

signal(sighup, sig_ign);

signal訊號函式,第乙個引數表示需要處理的訊號值(sighup),第二個引數為處理函式或者是乙個表示,這裡,sig_ign表示忽略sighup那個註冊的訊號。

sighup和控制台操作有關,當控制台被關閉時系統會向擁有控制台sessionid的所有程序傳送hup訊號,預設hup訊號的action是 exit,如果遠端登陸啟動某個服務程序並在程式執行時關閉連線的話會導致服務程序退出,所以一般服務程序都會用nohup工具啟動或寫成乙個 daemon。

c語言中,訊號量的資料型別為結構sem_t,它本質上是乙個長整型的數。

它的原型為: 

extern int sem_init __p ((sem_t *__sem, int __pshared, unsigned int __value));
標頭檔案為: #include

sem為指向訊號量結構的乙個指標;

pshared不為0時此訊號量在程序間共享,否則只能為當前程序的所有執行緒共享;

value給出了訊號量的初始值。

函式sem_post( sem_t *sem )用來增加訊號量的值當有執行緒阻塞在這個訊號量上時,呼叫這個函式會使其中的乙個執行緒不再阻塞,選擇機制同樣是由執行緒的排程策略決定的。

函式sem_wait( sem_t *sem )被用來阻塞當前執行緒直到訊號量sem的值大於0,解除阻塞後將sem的值減一,表明公共資源經使用後減少。

函式sem_trywait ( sem_t *sem )是函式sem_wait()的非阻塞版本,它直接將訊號量sem的值減一。

函式sem_destroy(sem_t *sem)用來釋放訊號量sem。

#includeint sem_init (sem_t *sem, int pshared, unsigned int value);
這個函式的作用是對由sem指定的訊號量進行初始化,設定好它的共享選項,並指定乙個整數型別的初始值。pshared引數控制著訊號量的型別。如果 pshared的值是0,就表示它是當前程序的區域性訊號量;否則,其它程序就能夠共享這個訊號量。只對不讓程序共享的訊號量感興趣。(這個引數受版本影響), linux執行緒一般不支援程序間共享訊號量,pshared傳遞乙個非零將會使函式返回enosys錯誤。

(2)這兩個函式控制著訊號量的值,它們的定義如下所示:

#include int sem_wait(sem_t * sem);

int sem_post(sem_t * sem);

這兩個函式都要用乙個由sem_init呼叫初始化的訊號量物件的指標做引數。

sem_post函式的作用是給訊號量的值加上乙個「1」,它是乙個「原子操作"即同時對同乙個訊號量做加「1」操作的兩個執行緒是不會衝突的;而同時對同乙個檔案進行讀、加和寫操作的兩個程式就有可能會引起衝突。訊號量的值永遠會正確地加乙個「2」--因為有兩個執行緒試圖改變它。

sem_wait函式也是乙個原子操作,它的作用是從訊號量的值減去乙個「1」,但它永遠會先等待該訊號量為乙個非零值才開始做減法。也就是說,如果你對乙個值為2的訊號量呼叫sem_wait(),執行緒將會繼續執行,訊號量的值將減到1。如果對乙個值為0的訊號量呼叫sem_wait(),這個函式就會地等待直到有其它執行緒增加了這個值使它不再是0為止。如果有兩個執行緒都在sem_wait()中等待同乙個訊號量變成非零值,那麼當它被第三個執行緒增加乙個「1」時,等待執行緒中只有乙個能夠對訊號量做減法並繼續執行,另乙個還將處於等待狀態。

訊號量這種「只用乙個函式就能原子化地測試和設定」的能力下正是它的價值所在。還有另外乙個訊號量函式sem_trywait,它是sem_wait的非阻塞搭檔。sem_trywait是乙個立即返回函式,不會因為任何事情阻塞。根據其返回值得到不同的資訊。如果返回值為0,說明訊號量在該函式呼叫之前大於0,但是呼叫之後會被該函式自動減1,至於呼叫之後是否為零則不得而知了。如果返回值為eagain說明訊號量計數為0。

(3) 獲得訊號量sem的值,並儲存到valp中。下面的定義:

#includeint sem_getvalue(sem_t *sem, int *valp);
(4) 最後乙個訊號量函式是sem_destroy。這個函式的作用是在我們用完訊號量對它進行清理。下面的定義:

#includeint sem_destroy (sem_t *sem);
這個函式也使用乙個訊號量指標做引數,歸還自己佔據的一切資源。在清理訊號量的時候如果還有執行緒在等待它,使用者就會收到乙個錯誤。

然而在linux的執行緒中,其實是沒有任何資源關聯到訊號量物件需要釋放的,因此在linux中,銷毀訊號量物件的作用僅僅是測試是否有執行緒因為該訊號量在等待。如果函式返回0說明沒有,正常登出訊號量,如果返回ebusy,說明還有執行緒正在等待該訊號量的訊號。

與其它的函式一樣,這些函式在成功時都返回「0」。

使用步驟

1.宣告訊號量sem_t sem1;

2.初始化訊號量sem_init(&sem1,0,1);

3.sem_post和sem_wait函式配合使用來達到執行緒同步

4.釋放訊號量int sem_destroy (&sem1);

訊號 訊號量

訊號是由 系統或者程序傳送給目標程序的資訊,以通知目標程序某個狀態的改變或系統異常。linux訊號可以由如下條件產生 1 對於前台程序,使用者可以通過輸入特殊的終端字元來給它傳送訊號。比如輸入ctrl c通常或給程序傳送乙個中斷訊號 2 系統異常。比如浮點異常和非法記憶體段訪問。3 系統狀態變化 4...

訊號量 二值訊號量

訊號量 二值訊號量 訊號量是作業系統的重要部分,訊號量一般用來進行資源管理和任務同步。freertos中訊號量分為二值訊號量 互斥訊號量 計數訊號量和遞迴互斥訊號量,應用場景各不同。二值訊號量通常用於互斥訪問或同步,二值訊號量和互斥訊號量非常相似,但互斥訊號量有優先順序,二值訊號量沒有。因此二值訊號...

python訊號量 Python訊號量

python訊號量教程 訊號量是由作業系統管理的一種抽象資料型別,用於在多執行緒中同步對共享資源的使用。本質上說,訊號量是乙個內部資料,用於標明當前的共享資源可以有多少併發讀取。也可以簡單的理解為,訊號量是多把鎖,同時允許多個執行緒來更改資料,而 python訊號量與互斥鎖的關係 訊號量的乙個特殊用...