linux中的訊號

2021-09-26 09:12:52 字數 2885 閱讀 1402

1.什麼是訊號

1.1 訊號是內容受限的一種非同步通訊機制

(1)訊號的目的:用來通訊

(2)訊號是非同步的(對比硬體中斷)

(3)訊號本質上是int型數字編號(事先定義好的)

1.2 訊號由誰發出

(1)使用者在終端按下按鍵

(2)硬體異常後由作業系統核心發出訊號

(3)使用者使用kill命令向其他程序發出訊號

(4)某種軟體條件滿足後也會發出訊號,如alarm鬧鐘時間到會產生sigalarm訊號,向乙個讀端已經關閉的管道write時會產生sigpipe訊號

1.3 訊號由誰處理、如何處理

(1)忽略訊號

(2)捕獲訊號(訊號繫結了乙個函式)

(3)預設處理(當前程序沒有明顯的管這個訊號,預設:忽略或終止程序)

2.常見訊號介紹

(1)sigint                      2        ctrl+c時os送給前台程序組中每個程序

(2)sigabrt                  6        呼叫abort函式,程序異常終止

(3)sigpoll    sigio    8        指示乙個非同步io事件,在高階io中提及

(4)sigkill                    9        殺死程序的終極辦法

(5)sigse**                11        無效儲存訪問時os發出該訊號

(6)sigpipe                  13        涉及管道和socket

(7)sigalarm              14        涉及alarm函式的實現

(8)sigterm                15        kill命令傳送的os預設終止訊號

(9)sigchld                17        子程序終止或停止時os向其父程序發此訊號

(10)

sigusr1                     10        使用者自定義訊號,作用和意義由應用自己定義

sigusr2                     12

3.程序對訊號的處理

3.1 signal函式介紹

3.2 用signal函式處理sigint訊號

(1)預設處理

(2)忽略處理

(3)捕獲處理

細節:(1)signal函式繫結乙個捕獲函式後訊號發生後會自動執行繫結的捕獲函式,並且把訊號編號作為傳參傳給捕獲函式

(2)signal的返回值在出錯時為sig_err,繫結成功時返回舊的捕獲函式

3.3 signal函式的優點和缺點

(1)優點:簡單好用,捕獲訊號常用

(2)缺點:無法簡單直接得知之前設定的對訊號的處理方法

3.4 sigaction函式介紹

(1)2個都是api,但是sigaction比signal更具有可移植性

(2)用法關鍵是2個sigaction指標

sigaction比signal好的一點:sigaction可以一次得到設定新捕獲函式和獲取舊的捕獲函式(其實還可以單獨設定新的捕獲或者單獨只獲取舊的捕獲函式),而signal函式不能單獨獲取舊的捕獲函式而必須在設定新的捕獲函式的同時才獲取舊的捕獲函式。

訊號與槽

#include #include #include typedef void (*sighandler_t)(int);

void func(int sig)

int main(void)

printf("before while(1)\n");

while(1);

printf("after while(1)\n");

return 0;

}

4.alarm和pause函式

4.1 alarm函式

(1)核心以api形式提供的鬧鐘

(2)程式設計實踐

4.2 pause函式

(1)核心掛起

(2)**實踐

pause函式的作用就是讓當前程序暫停執行,交出cpu給其他程序去執行。當當前程序進入pause狀態後當前程序會表現為「卡住、阻塞住」,要退出pause狀態當前程序需要被訊號喚醒。

4.3 使用alarm和pause來模擬sleep

#include #include // unix standand

#include void func(int sig)

*/}void mysleep(unsigned int seconds);

int main(void);

act.sa_handler = func;

sigaction(sigalrm, &act, null);

//signal(sigalrm, func);

ret = alarm(5);

printf("1st, ret = %d.\n", ret);

sleep(3);

ret = alarm(5); // 返回值是2但是本次alarm會重新定5s

printf("2st, ret = %d.\n", ret);

sleep(1);

ret = alarm(5);

printf("3st, ret = %d.\n", ret);

//while (1);

pause();

*/ return 0;

}void mysleep(unsigned int seconds);

act.sa_handler = func;

sigaction(sigalrm, &act, null);

alarm(seconds);

pause();

}

linux中的訊號1 訊號概述

以下內容源於朱有鵬 物聯網大講堂 課程的學習整理,1 訊號的目的 用來程序間通訊 ipc 程序和核心間的通訊 2 訊號是非同步的 類似於軟體中斷,對比硬體中斷,如按鍵,不知道什麼時候按下 3 訊號本質上是 int型 數字編號 每個編號有特定的含義 內容是十分有限的。1 使用者在終端按下按鍵 2 硬體...

Linux中的訊號處理

突然想起使用sigaction註冊訊號處理函式時,訊號處理函式型別有二個 struct sigaction 通過對上面的sa flags賦值為sa siginfo,讓系統使用多引數的訊號處理函式。在處理函式中,由於傳進來乙個siginfo t的引數,我們可以通過它獲取到哪個程序傳進來的訊息。今天試了...

Linux系統中的訊號

訊號 signal 是linux系統中用於程序之間相互通訊或操作的一種機制。訊號是乙個相當廣泛的課題 在這裡,我們僅僅 幾種最重要的訊號以及利用訊號控制程序的技術。訊號是乙個傳送到程序的特殊資訊。訊號機制是非同步的 當乙個程序接收到乙個訊號時,它會立刻處理這個訊號,而不會等待當前函式甚至當前一行 結...