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...