Linux系統程式設計 訊號的產生

2021-09-11 13:30:55 字數 3471 閱讀 7314

ctrl + c

傳送2號訊號sigint,將中止當前程序。sigint的「int」是interrupt的意思;

ctrl + z

傳送20號訊號sigtstp,暫停/停止當前程序。sigtstp中的「t」是terminal的意思。程序收到此訊號後,將由當前轉入後台,可用ps aux找到它。

比如說,我們使用vim編寫**時,需要在vim以外處理一些事情,但又不想退出vim,可用ctrl + z命令讓vim程序進入後台,之後再用fg命令重新將vim程序喚回前台,繼續編輯;

ctrl + *

傳送 3號訊號sigquit給前台程序組中的所有程序,終止前台程序並生成 core 檔案;

硬體異常產生訊號

a. 除0操作

產生8號訊號sigfpe,終止程序並產生core檔案。sigfpe的「f」是float的意思;

b. 非法訪問記憶體

產生11號訊號sigse**,段錯誤;

c. 匯流排錯誤

產生7號訊號sigbus

kill函式/命令產生訊號

從字面上來看,kill是殺死的意思,但這個命令/函式真正的意思是向程序傳送訊號。真不知道當時設計這個命令/函式的人是怎麼想的。

kill命令使用方法:

kill -訊號編號/巨集 程序號。比如:kill -sigkill 1893,表示傳送sigkill訊號給1893號程序,即殺死1893號程序。

kill函式的用法:

函式原型:

int kill(pid_t pid, int sig);

返回值:

成功:返回0;失敗:返回-1,並設定errno。

引數說明:

sig:要傳送的訊號,最好寫巨集名,而不要寫訊號編號,因為各個平台訊號的編號可能不一樣,而巨集名都是唯一的;

pid:要傳送的目標程序;

pid > 0:傳送訊號給程序號為pid的程序;

pid = 0:傳送訊號給與呼叫kill函式程序屬於同一程序組的所有程序;

pid < 0:傳送訊號給程序組號為|pid|所有程序;

pid = -1:傳送給程序有許可權傳送的系統中所有程序。啥是「有許可權傳送」?比如你就不能給init程序發訊號,因為你沒許可權。

例程:迴圈建立5個程序,並殺死第三個子程序。

1#include 

2#include

3#include

4#include

5 67#define n 5

8 9int main()

1025

26 if (i < n)

31 } else

if (i == n)

3738 return 0;

39}複製**

raise和abort函式

rase函式:

int raise(int sig); 成功:返回0,失敗:返回非0值。

給當前程序傳送指定訊號。簡單一句話:自己給自己發訊號。

abort函式:

void abort(void); 無返回值。

給自己傳送異常終止訊號sigabrt,終止程序並產生core檔案。

alarm函式

函式原型:

unsigned int alarm(unsigned int seconds);

返回值:

返回0或者上次鬧鐘剩餘秒數,無失敗情況;

函式作用:

設定定時器,在指定時間之後,核心給呼叫alarm的函式傳送sigalrm訊號。程序收到該訊號後,預設動作是終止當前程序

每個程序有且只有乙個定時器,並且與程序的狀態無關。也就是說,不管程序處於就緒、執行、掛起(阻塞/暫停)、終止、殭屍、孤兒,alarm定時器一直都在計時。

常見用法:

alarm(5); --> 5秒後傳送sigalrm訊號。如果在2秒後呼叫alarm(2),則alarm(2)返回值是3,並且在2秒後傳送sigalrm訊號;

alarm(0); --> 取消定時器,並返回上次呼叫alarm剩下的秒數。

1#include 

2#include

3 4int main()

5複製**

setitimer函式

與alarm類似,可設定定時器,但是,alarm函式定時精度只能到秒,而setitimer函式定時可達到微秒級,並且可以週期定時。

函式原型:

int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value);

返回值:

成功:返回0;失敗:返回-1,並設定errno。

引數說明:

引數which:指定定時方式:

a. 自然定時:itimer_real。計算程式執行自然時間,就是程式不管在核心態還是使用者態,都計時。到達時間點後,傳送sigarm訊號;

b. 使用者空間定時:itimer_virtual。只計算程序戰勝cpu的時間,即使用者空間時間。到達時間點後,傳送si**talrm訊號;

c. 執行時計時:itimer_prof。計算占用cpu及執行系統呼叫的時間,也即使用者空間時間及核心時間總和。到達時間點後,傳送sigprof訊號。

這三種定時方式,最常用的就是自然定時法,即引數為itimer_real的定時方式,而後兩種方式不常用,有用到時再查手冊。

結構體struct itimerval有兩個成員,乙個是it_value, 另乙個是it_interval。他們倆都是可以精確到微秒的,以struct timeval來控制具體時間。it_value控制了多久之後第一次傳送訊號,之後會迴圈傳送,間隔是it_interval。

引數new_value:設定的定時時間;

引數old_value:上次呼叫setitimer剩餘的時間。

例程:自己實現alarm函式:

1#include 

2#include

3#include

4#include

5 6unsigned int my_alarm(unsigned int sec)

721 return old_value.it_value.tv_sec;

22}23

24int main()

25複製**

Linux系統程式設計 訊號

0x00 訊號和中斷類似,中斷是硬體發出,而訊號由軟體發出。訊號常用於程序間通訊,乙個訊號常見的處理如下 1 設定對應訊號的訊號處理函式。2 當訊號來臨時,打斷正常執行的程式 本質上是在系統呼叫前檢查是否有訊號的到來 去執行訊號處理函式。3 訊號處理函式執行完,繼續執行原程式。0x01 我們先來看一...

Linux系統程式設計 訊號

基本概念 訊號的狀態 產生未決狀態 沒有被處理的 遞達 已經被處理的 訊號的優先順序比較高 程序收到訊號之後,暫停正在處理的工作 訊號集 kill 發射訊號給某個程序 raise 自己給自己發訊號 函式原型 int raise int sig abort 給自己傳送異常終止的訊號 alarm 設定定...

Linux系統程式設計 訊號

訊號的共性 1.簡單 2.不能攜帶大量資訊 3.滿足特定條件才能傳送 訊號的機制 1.訊號是軟體層面的中斷。一旦訊號產生,無論程式執行到什麼位置都必須結束 2.所有訊號的產生以及處理都是核心產生.訊號的產生 1.按鍵產生 程ctrl c ctrl v 2.系統呼叫產生 kill函式 3.定時器 al...