訊號(分類 傳送)

2021-08-20 01:35:11 字數 2295 閱讀 8046

linux訊號機制基本上是從unix系統中繼承過來的。早期unix系統中的訊號機制比較簡單和原始,後來在實踐中暴露出一些問題,它的主要問題是:

程序每次處理訊號後,就將對訊號的響應設定為預設動作。在某些情況下,將導致對訊號的錯誤處理;因此,使用者如果不希望這樣的操作,那麼就要在訊號處理函式結尾再一次呼叫signal(),重新安裝該訊號。

早期unix下的不可靠訊號主要指的是程序可能對訊號做出錯誤的反應以及訊號可能丟失。

linux支援不可靠訊號,但是對不可靠訊號機制做了改進:在呼叫完訊號處理函式後,不必重新呼叫該訊號的安裝函式(訊號安裝函式是在可靠機制上的實現)。因此,linux下的不可靠訊號問題主要指的是訊號可能丟失。

隨著時間的發展,實踐證明,有必要對訊號的原始機制加以改進和擴充。所以,後來出現的各種unix版本分別在這方面進行了研究,力圖實現"可靠訊號"。由於原來定義的訊號已有許多應用,不好再做改動,最終只好又新增加了一些訊號,並在一開始就把它們定義為可靠訊號,這些訊號支援排隊,不會丟失。同時,訊號的傳送和安裝也出現了新版本:訊號傳送函式sigqueue()及訊號安裝函式sigaction()。

早期unix系統只定義了32種訊號,rethat7.2支援64種訊號,編號0-63(sigrtmin=31,sigrtmax=63),將來可能進一步增加,這需要得到核心的支援。前32種訊號已經有了預定義值,每個訊號有了確定的用途及含義,並且每種訊號都有各自的預設動作。如按鍵盤的ctrl+c時,會產生sigint訊號,對該訊號的預設反應就是程序終止。後32個訊號表示實時訊號,等同於前面闡述的可靠訊號。這保證了傳送的多個實時訊號都被接收。實時訊號是posix標準的一部分,可用於應用程序。

非實時訊號都不支援排隊,都是不可靠訊號;實時訊號都支援排隊,都是可靠訊號。

#include #include int kill(pid_t pid, int sig);
pid>0將訊號sig發給pid程序

pid=0將訊號sig發給同組程序

pid=-1將訊號sig傳送給所有程序,呼叫者程序有許可權傳送的每乙個程序(除了1號程序之外,還有它自身)

pid

#include#include#include#includevoid  myhandle(int num)

else if (num == sigusr1)

}int main(int argv,char* argc)

if (signal(sigusr1, myhandle) == sig_err)

pid = fork();

if (pid == 0)

int n = 3;

do while (n > 0);

return 0;

}

#include int raise(int sig);
給自己傳送訊號。raise(sig)等價於kill(getpid(), sig);

#include int pause(void);
將程序置為可中斷睡眠狀態。然後它呼叫核心函式schedule(),使linux程序排程器找到另乙個程序來執行。pause使呼叫者程序掛起,直到乙個訊號**獲。

#include unsigned int alarm(unsigned int seconds);
alarm函式,設定乙個鬧鐘延遲傳送訊號,告訴linux核心n秒中以後,傳送sigalrm訊號。

#include unsigned int sleep(unsigned int seconds);
讓程序睡眠。能被訊號打斷,然後處理訊號函式以後,就不再睡眠了,直接向下執行**。sleep函式的返回值,是剩餘的秒數。

為了增強程式的穩定性,在訊號處理函式中應使用可重入函式。所謂可重入函式是指乙個可以被多個任務呼叫的過程,任務在呼叫時不必擔心資料是否會出錯。因為程序在收到訊號後,就將跳轉到訊號處理函式去接著執行。如果訊號處理函式中使用了不可重入函式,那麼訊號處理函式可能會修改原來程序中不應該被修改的資料,這樣程序從訊號處理函式中返回接著執行時,可能會出現不可預料的後果。不可重入函式在訊號處理函式中被視為不安全函式。

訊號的傳送 kill raise

1.函式說明 kill和raise是用來傳送訊號的 kill把訊號傳送給程序或程序組 raise把訊號傳送給 程序 自身.他們的原型如下 include int kill pid t pid,int signo int raise int signo 成功則返回0,出錯則返回 1 從原型上可以看出,...

Shell 訊號傳送與捕捉

防偽碼 李白乘舟將欲行,忽聞岸上踏歌聲。9.1 linux 訊號型別 訊號 signal 訊號是在軟體層次上對中斷機制的一種模擬,通過給乙個程序傳送訊號,執行響 應的處理函式。程序可以通過三種方式來響應乙個訊號 1 忽略訊號,即對訊號不做任何處理,其中有兩個訊號不能忽略 sigkill 及 sigs...

Linux C程式設計 訊號的傳送

前面介紹了linux中訊號的一些基本情況,這裡總結一下訊號的傳送。訊號的傳送主要由函式kill raise sigqueue alarm settimer abort 來完成。include include int kill pid t pid,int sig 關於第乙個引數,有如下注意 raise...