訊號的產生

2021-09-28 22:56:54 字數 3226 閱讀 4660

ctrl + c  → 2) sigint(終止/中斷)  "int" ----interrupt

ctrl + z  → 20) sigtstp(暫停/停止)  "t" ----terminal 終端,停止當前跟終端互動的程序。

ctrl + \  → 3) sigquit(退出)

除0操作   → 8) sigfpe (浮點數例外)     "f" -----float 浮點數。

非法訪問記憶體  → 11) sigse** (段錯誤)

匯流排錯誤  → 7) sigbus     

kill命令產生訊號:kill -sigkill pid

kill函式:給指定程序傳送指定訊號(不一定殺死)

int kill(pid_t pid, int sig); 成功:0;失敗:-1 (id非法,訊號非法,普通使用者殺init程序等權級問題),設定errno

pid > 0:  傳送訊號給指定的程序。

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

pid < 0:  取|pid|發給對應程序組。

pid = -1:傳送給程序有許可權傳送的系統中所有程序。即殺死當前程序組的所有程序

kill -9 -19892殺死19892程序組的所有程序 注:程序前加負號,殺死某個程序組
程序組:每個程序都屬於乙個程序組,程序組是乙個或多個程序集合,他們相互關聯,共同完成乙個實體任務,每個程序組都有乙個程序組長,預設程序組id與程序組長id相同。

許可權保護:super使用者(root)可以傳送訊號給任意使用者,普通使用者是不能向系統使用者傳送訊號的。 kill -9 (root使用者的pid)  是不可以的。同樣,普通使用者也不能向其他普通使用者傳送訊號,終止其程序。 只能向自己建立的程序傳送訊號。普通使用者基本規則是:傳送者實際或有效使用者id == 接收者實際或有效使用者id

練習:程序自己殺死自己

1、殺死當前程序(程序自殺)

#include #include #include #include int main(void)

return 0;

}

練習:迴圈建立5個子程序,讓父程序殺死第三個子程序。  

#define n 5

int main(void)

if(i == 2) //此時是第三個子程序

}if(i < 5)

}else

return 0;

}

raise 函式:給當前程序傳送指定訊號(自己給自己發)  raise(signo) == kill(getpid(), signo);

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

abort 函式:給自己傳送異常終止訊號 6) sigabrt 訊號,終止並產生core檔案

void abort(void); 該函式無返回

alarm函式    

設定定時器(鬧鐘)。在指定seconds後,核心會給當前程序傳送14)sigalrm訊號。程序收到該訊號,預設動作終止。

每個程序都有且只有唯一個定時器。

unsigned int alarm(unsigned int seconds); 返回0或剩餘的秒數,無失敗。

常用:取消定時器alarm(0),返回舊鬧鐘餘下秒數,但是定時器採用新設定的時間延時,此時就是0s關閉鬧鐘

例:alarm(5) → 經過3sec → alarm(4) → 5sec → alarm(5) → alarm(0)

這裡所用的定時與程序狀態無關(自然定時法)!就緒、執行、掛起(阻塞、暫停)、終止、殭屍...無論程序處於何種狀態,alarm都計時。

練習:編寫程式,測試你使用的計算機1秒鐘能數多少個數。 

4、練習:編寫程式,測試你使用的計算機1秒鐘能數多少個數。

int main(void)

return 0;

}time命令可以測試當前程序執行所用的時間

實際執行時間 = 系統時間 + 使用者時間 + 等待時間

注:實際上程序執行1s,實際上真正的執行時間小於1s,需考慮等待時間

優化:把數字不要輸出到螢幕,直接輸出到檔案

*程式執行的瓶頸在於io,優化程式,首選優化io。

time ./a.out > out.txt

設定定時器(鬧鐘)。 可代替alarm函式。精度微秒us可以實現週期定時。

int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value);    成功:0;失敗:-1,設定errno

引數:new_value:定義的延時時間

old_value:上一次定時所剩餘的時間

which:指定定時方式

① 自然定時:itimer_real → 14)siglarm                                          計算自然時間(常用)

② 虛擬空間計時(使用者空間):itimer_virtual → 26)si**talrm     只計算程序占用cpu的時間

③ 執行時計時(使用者+核心):itimer_prof → 27)sigprof          計算占用cpu及執行系統呼叫的時間

練習: 使用setitimer函式實現alarm函式,重複計算機1秒數數程式。  

#include #include #include /*

*struct itimerval it_interval;

struct timeval it_value;

} it, oldit;

*/unsigned int my_alarm(unsigned int sec)

return oldit.it_value.tv_sec;

}int main(void)

拓展練習,結合man page編寫程式,測試it_interval、it_value這兩個引數的作用。  

it_value:定時的時長                            

兩個引數都設定為0,即清0操作。

核心產生訊號

之前只知道核心往使用者空間傳送訊號可以用 非同步通知 昨天接觸到乙個新的函式,查了一下ulk3 page431 發現核心中有一族函式專門為程序產生訊號的。由於自己之前沒用過,最近又在看別的東西,先羅列在這 intsend sig int sig,struct task struct p,int pr...

linux之訊號產生

使用者在終端按下某些鍵時,終端驅動程式會傳送訊號給前台程序,例如ctrl c產生sigint信 號,ctrl 產生sigquit訊號,ctrl z產生sigtstp訊號。sigint的預設處理動作是終止程序,sigquit的預設處理動作是終止程序並且core dump,首先解釋什麼是core dum...

MATLAB 產生頻寬訊號

clc clear all close all 產生中心頻率150mhz 頻寬50mhz,取樣率252mhz的頻寬訊號 tp 65.015e 6 發射時寬.控制點數.比如要輸出的點數是l,tp l fs 16384 252e6 65.015e 6 b 50e6 發射頻寬 k b tp 發射調頻率 f...