程序a向程序b傳送訊號
忽略/恢復某訊號
訊號是當作業系統中某些情況發生改變時,由作業系統向程序傳送,程序可對訊號進行捕捉並處理;
程序缺省會對不同的訊號進行處理,使用者可通過自定義訊號處理函式並使用signal()將自定義的訊號處理函式與指定訊號進行繫結,
訊號處理函式在訊號預設處理方式之前呼叫,原先處理方式不執行;
在 中,訊號名都被定義為正整數常量,訊號名都以 sig 開頭;☞ 訊號的檢視
[user@localhost day0416_linux_signal]$ kill -l
1) sighup 2) sigint 3) sigquit 4) sigill 5) sigtrap
6) sigabrt 7) sigbus 8) sigfpe 9) sigkill 10) sigusr1
11) sigse** 12) sigusr2 13) sigpipe 14) sigalrm 15) sigterm
16) sigstkflt 17) sigchld 18) sigcont 19) sigstop 20) sigtstp
21) sigttin 22) sigttou 23) sigurg 24) sigxcpu 25) sigxfsz
26) si**talrm 27) sigprof 28) sigwinch 29) sigio 30) sigpwr
31) sigsys 34) sigrtmin 35) sigrtmin+1 36) sigrtmin+2 37) sigrtmin+3
38) sigrtmin+4 39) sigrtmin+5 40) sigrtmin+6 41) sigrtmin+7 42) sigrtmin+8
43) sigrtmin+9 44) sigrtmin+10 45) sigrtmin+11 46) sigrtmin+12 47) sigrtmin+13
48) sigrtmin+14 49) sigrtmin+15 50) sigrtmax-14 51) sigrtmax-13 52) sigrtmax-12
53) sigrtmax-11 54) sigrtmax-10 55) sigrtmax-9 56) sigrtmax-8 57) sigrtmax-7
58) sigrtmax-6 59) sigrtmax-5 60) sigrtmax-4 61) sigrtmax-3 62) sigrtmax-2
63) sigrtmax-1 64) sigrtmax
[user@localhost day0416_linux_signal]$
☞ 引入示例
#include #include int main()
1> signal訊號註冊函式原型
#include typedef void (*dighandler_t)(int) //定義了函式指標
sighandler_t signal(int signum,sighandler_t handler);
2> sigpipe訊號和sigint訊號sigpipe:(管道訊號) 當伺服器斷開連線,客戶端向伺服器傳送資料時,客戶端收到的訊號;
sigint:(終端訊號) 當某程序執行時被ctrl+c終止,則該程序會收到sigint訊號;
終止當前程序:ctrl+c或ctrl+\
#include void sig_pipe(int sign)
void sig_int(int sign)
int main()
3> sigalrm訊號
alarm(unsigned int second) 函式傳入的秒數減少到0時,作業系統向當前程序傳送sigalrm訊號;返回值:每個程序只能有乙個鬧鐘時間,如果在呼叫alarm之前已經為該程序設定了鬧鐘時間,則上次鬧鐘時間的剩餘值將會作為本次alarm的返回值,否則返回0;
#include //printf
#include //sleep、alarm
#include //signal、aigalrm
void handler()
int main()
return 0;
}
附加:alarm() 和 pause() 組合使用可以使程序掛起一段時間;(二者均位於 標頭檔案中!)
pause() 會掛機呼叫程序直到接收到乙個訊號;4> sigabrt訊號
abort()方法位於stdlib.h標頭檔案中,用於異常終止乙個程序;訊號註冊函式後,abort() 函式不會被阻塞!
#include #include int main()
#include #include #include void sig_abrt(int sign)
int main()
5> sigchld 訊號
當乙個程序終止時,作業系統將 sigchld訊號 傳送給其父程序,按系統預設將忽略此訊號。
#include #include #include #include #include void sig_chld(int sign)
int main()
}else
}
printf("...\n");
return 0;
}
執行結果:
[root@localhost day0229_2_signal]# gcc -o test_sigchld test_sigchld.c -std=c99
[root@localhost day0229_2_signal]# ./test_sigchld
子程序執行中!
子程序執行中!
子程序執行中!
子程序執行中!
子程序執行中!
...捕捉到子程序結束訊號sigchld!
...[root@localhost day0229_2_signal]#
1> 函式原型
int kill(pid_t pid,int sig);
pid>0時,將sig訊號傳送給pid程序;
pid==0時,將sig訊號傳送給當前程序同組的所有程序;
pid==-1時,將sig訊號傳送給所有程序;
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
引數二handler是乙個處理函式,或者是:
sig_ign:忽略引數signum所指的訊號。(ignore)
sig_dfl:恢復引數signum所指訊號的處理方法為預設值。(default)
要求:父子程序同時執行時按下ctrl+c終止子程序,而非父程序
#include #include #include #include #include #define ok 0
#define error -1
int main()else
return ok;
}
訊號處理,訊號佇列
最近幾天在看訊號,對實時訊號的實時性不是很理解,今天看了下 dequeue signal 差不多理解了,乙個實時訊號可以有多個實時佇列,在signal集合裡乙個signal可能有多個signal佇列。訊號,有訊號佇列,有訊號集 sigpending是訊號pending的結構體,裡面有sigqueue...
訊號及訊號處理(二) 可靠訊號與不可靠訊號
一 可靠訊號與不可靠訊號有哪些?sighup 1號 至 sigsys 31號 之間的訊號都是繼承自unix系統,是不可靠訊號,也稱為非實時訊號 sigrtmin 33號 與 sigrtmax 64號 之間的訊號,它們都是可靠訊號,也稱為實時訊號 二 什麼是可靠訊號?可靠性是指訊號是否會丟失,即該訊號...
訊號 系統與訊號處理邊角雜談
1.連續時間訊號的傅利葉變換一般寫為x j 而離散時間訊號的傅利葉變換一般寫為x ej 第乙個原因是,連續時間訊號傅利葉定積分中的ej t最終會運算成 而離散時間訊號傅利葉累加中的ej n最終會運算成ej 第二個原因是,將j 直接替換為s就在形式上得到laplas變換,將ej 直接替換為z就在形式上...