sigaction 用法例項

2021-09-22 21:58:13 字數 2266 閱讀 9726

sigaction函式的功能是檢查或修改與指定訊號相關聯的處理動作(可同時兩種操作)。

他是posix的訊號介面,而signal()是標準c的訊號介面(如果程式必須在非posix系統上執行,那麼就應該使用這個介面)

給訊號signum設定新的訊號處理函式act, 同時保留該訊號原有的訊號處理函式oldact

intsigaction(int signo,conststructsigaction*restrict act,

structsigaction*restrict oact);

結構sigaction定義如下:

structsigaction;

sa_handler欄位包含乙個訊號捕捉函式的位址

sa_mask欄位說明了乙個訊號集,在呼叫該訊號捕捉函式之前,這一訊號集要加進程式的訊號遮蔽字中。僅當從訊號捕捉函式返回時再將程序的訊號遮蔽字復位為原先值。

sa_flag是乙個選項,主要理解兩個

sa_nodefer:  當訊號處理函式正在進行時,不堵塞對於訊號處理函式自身訊號功能。

sa_resethand:當使用者註冊的訊號處理函式被執行過一次後,該訊號的處理函式被設為系統預設的處理函式。

sa_siginfo 提供附加資訊,乙個指向siginfo結構的指標以及乙個指向程序上下文識別符號的指標

最後乙個引數是乙個替代的訊號處理程式,當設定sa_siginfo時才會用他。

使用示例為:

[html]view plain

copy

#include   

#include   

void wrkprocess(int nsig)  

}  int main()    

1)執行改程式時,ctrl+c,第一次不會導致程式的結束。而是繼續執行,當使用者再次執行ctrl+c的時候,程式採用結束。

2)如果對程式稍微進行一下改動,則會出現另外一種情況。

改動為:act.sa_flags = sa_nodefer;

經過這種改變之後,無論對ctrl+d操作多少次,程式都不會結束。

3)下面如果再對程式進行一次改動,則會出現第三種情況。

for example:  act.sa_flags = 0;

在執行訊號處理函式這段期間,多次操作ctrl+c,程式也不會呼叫訊號處理函式,而是在本次訊號處理函式完成之後,在執行一次訊號處理函式(無論前面產生了多少次ctrl+c訊號)。

如果在2)執行訊號處理函式的過程中,再次給予ctrl+c訊號的時候,會導致再次呼叫訊號處理函式。

4)如果在程式中設定了sigaddset(&act.sa_mask,sigquit);程式在執行訊號處理函式的過程中,傳送ctrl+/訊號,程式也不會已經退出,而是在訊號處理函式執行完畢之後才會執行sigquit的訊號處理函式,然後程式退出。如果不新增這項設定,則程式將會在接收到ctrl+/訊號後馬上執行退出,無論是否在ctrl+c的訊號處理函式過程中。

原因如下:

1)情況下,第一次產生ctrl+c訊號的時候,該訊號被自己設定的訊號處理函式進行了處理。在處理過程中,由於我們設定了sa_resethand標誌位,又將該訊號的處理函式設定為預設的訊號處理函式(系統預設的處理方式為ign),所以在第二次傳送ctrl+d訊號的時候,是由預設的訊號處理函式處理的,導致程式結束;

2)情況下,我們去掉了sa_resethand了標誌位,導致程式中所有的ctrl+d訊號均是由我們自己的訊號處理函式來進行了處理,所以我們傳送多少次ctrl+c訊號程式都不會退出;

3)情況下,我們去掉了sa_nodefer標誌位。程式在執行訊號處理函式過程中,ctrl+c訊號將會被阻止,但是在執行訊號處理函式期傳送的ctrl+c訊號將會被阻塞,知道訊號處理函式執行完成,才有機會處理訊號函式執行期間產生的ctrl+c,但是在訊號函式執行產生的多次ctrl+c,最後只會產生ctrl+c。2)情況下,由於設定了sa_nodef,ctrl+c訊號將不會被阻塞。所以能夠並行執行下次的訊號處理函式。

4)情況下,我們是設定了在執行訊號處理函式過程中,我們將遮蔽該訊號,當遮蔽該訊號的處理函式執行完畢後才會進行處理該訊號。

附:當我們按下ctrl+c的時候,操作為:向系統傳送sigint訊號,sigint訊號的預設處理,退出程式。

當我們按下ctrl+/的時候,操作為:向系統傳送sigquit訊號,該訊號的預設處理為退出程式。

from: 

參考: sigaction函式解析

sigaction 用法例項

sigaction函式的功能是檢查或修改與指定訊號相關聯的處理動作 可同時兩種操作 他是posix的訊號介面,而signal 是標準c的訊號介面 如果程式必須在非posix系統上執行,那麼就應該使用這個介面 給訊號signum設定新的訊號處理函式act,同時保留該訊號原有的訊號處理函式oldact ...

sigaction 用法例項

sigaction函式的功能是檢查或修改與指定訊號相關聯的處理動作 可同時兩種操作 他是posix的訊號介面,而signal 是標準c的訊號介面 如果程式必須在非posix系統上執行,那麼就應該使用這個介面 給訊號signum設定新的訊號處理函式act,同時保留該訊號原有的訊號處理函式oldact ...

sigaction函式使用例項

sigaction函式 1 sigaction函式原型 sigaction函式用來查詢和設定訊號處理方式,它是用來替換早期的signal函式。sigaction函式原型及說明如下 sigaction 查詢和設定訊號處理方式 所需標頭檔案 include 函式說明 sigaction 會依引數sign...