訊號共性:
簡單、不能攜帶大量資訊、滿足條件才傳送
訊號的特質:
訊號是軟體層面的 中斷。一旦訊號產生,無論程式執行到什麼位置,必須停止執行,處理訊號,處理結束,再繼續執行後續指令。
所有訊號的產生及處理都是 由 核心完成的。
產生訊號:
1.按鍵產生 如:ctrl+c
2.系統呼叫產生 如:kill
3.軟體條件產生 如:定時器 alarm
4.硬體異常產生 如:非法訪問記憶體(段錯誤)、除0
5.命令產生 如:kill命令
概念:未決:產生與遞達之間狀態
遞達:產生並且送達到程序、直接被核心處理掉
訊號處理方式:執行預設處理動作(終止程序、忽略訊號、暫停程序、繼續執行、終止生成core檔案檢視程序死亡原因)
、忽略、捕捉(自定義)
阻塞訊號集(訊號遮蔽字):本質:位圖。用來記錄訊號的遮蔽狀態。一旦被遮蔽的訊號,在解除遮蔽前,一直處於未決狀態。
未決訊號集: 本質:位圖。用來記錄訊號的處理狀態。該訊號集中的訊號表示,已經產生,但尚未被處理。
可以操作阻塞訊號集 來影響未決訊號集 未決訊號集不允許操作
訊號四要素:
訊號使用之前,應先確定四要素,然後再用
訊號編號、訊號名稱、訊號對應事件、訊號預設處理動作
kill命令和kill函式:
kill -9 -1900 (剎死 程序組號為 1900 的所有程序 程序組號同父程序號)
int kill(pid_t pid,int signum)
引數:pid: >0:傳送訊號給指定程序
=0:傳送訊號給 跟呼叫kill函式的那個程序處於同一程序組的程序
<-1:取絕對值,傳送訊號給該絕對值所對應的程序組的所有組員
=-1:傳送訊號給,有許可權傳送的所有程序
返回值:
成功:0
失敗:-1 errno
#include#include#include#include#includeint main()
}else if(pid==0)
return 0;
}
alarm 函式:
每個程序有且只有唯一 乙個定時器
定時傳送sigalrm 給當前程序。
unsigned int alarm(unsigned int seconds);
seconds:定時秒數
返回值:上次定時剩餘時間
無錯誤現象
alarm(0)取消鬧鐘
time 命令 :檢視程式執行時間。 實際時間 = 使用者時間+核心時間+等待時間 --》優化瓶頸 io
//測試一秒 數數
#include#includeint main()
return 0;
}
setitimer函式:
int setitimer(int which, const struct itimerval *new_value,struct itimerval *old_value);
引數:which: itimer_real: 採用自然計時 --》 sigalrm
itimer_virtual: 採用使用者計時 --》si**talrm
itimer_prof : 採用核心 +使用者空間計時 --》sigprof
new_value:定數秒數
型別: struct itimervalit_interval;
struct timevalit_value;
old_value:傳出引數,上次定時剩餘時間。
e.g:
struct timeval ner_t;
struct timeval old_t;
new_t.it_interval.tv_sec=1;
new_t.it_interval.tv_usec=0;
new_t.it_value.tv_sec=0;
new_t.it_value.tv_usec=0;
setitimer(&new_t,&old_t)
返回值:
成功:0
失敗:-1 errno
其他幾個發訊號函式:
int raise(int sig)
void abort(void)
Linux訊號相關函式示例
程式在執行時,系統所傳來的指示。你在家呆著有人來敲門 linux下常見訊號 1 sighup 2 sigint 3 sigquit 4 sigill 5 sigtrap 6 sigabrt 7 sigbus 8 sigfpe 9 sigkill 10 sigusr1 11 sigse 12 sigu...
Linux訊號集相關函式操作
在linux的程序中可以接收到各種的訊號,並且如果你不對訊號進行處理,linux中的程序就會採用預設的處理方式處理,比如ctrl c的訊號,程序對它的處理就是終止程序的執行。在linux中,我們也可以在程序中遮蔽掉某些訊號,使程序不去處理這些訊號,但其中的sigkill和sigstop是不能被阻塞的...
訊號相關函式彙總
1.函式說明 kill 和raise 是用來傳送訊號的 kill 把訊號傳送給程序或程序組 它不僅可以中止程序,也可以向程序傳送其他訊號 raise 把訊號傳送給 程序 自身.它們的原型如下 include include int kill pid t pid,指明要傳送的訊號程序號 int sig...