創建幾種信號:
SIGHUP: 從終端上發出的結束信號
SIGINT:來自鍵盤的中斷信號(Ctrl-C)
SIGQUIT:來自鍵盤的退出信號(Ctrl-\)
SIGKILL:該信號結束接收信號的進程
SIGTERM: kill命令發出的信號
SIGCHLD:標識子進程停止或結束的信號
SIGSTOP:來自鍵盤(Ctrl-Z)或調試程序的停止執行信號
信號處理:
一、忽略此信號;(但SIGKILL和SIGSTOP信號不可被忽略)
二、執行用戶希望的動作;(調用一個用戶函數,執行用戶希望的處理)
三、執行系統默認動作;(對大多數信號的系統默認動作是終止進程)
信號發送:(主要函數有kill和raise)
區別:
kill既可以向自身發送信號,也可以向其他進程發送信號,raise是向進程自身發送信號。
intkill(pid_t pid, int signo)
intraise(int signo)
alarm方式發送:
使用alarm函數可以設置一個時間值,當所設置的時間到了時,產生SIGALRM信號。如果不捕捉此信號,則默認動作是終止此進程。
unsigned int alarm(unsigned int seconds)
seconds:經過了指定的seconds秒後會產生SIGALRM
pause函數:
使調用進程掛起,直至捕捉到一個信號。
intpause(void)
只有執行了一個信號處理函數後,掛起才結束
signal
void(*signal (int signo, void (*func)(int)))(int)
-->
typedef void (*sighandler_t)(int)
sighandler_t signal(int signum,sighandler_t handler)
func可能的值:
1、SIG_IGN:忽略此信號
2、SIG_DFL:按系統默認方式處理
3、信號處理函數名:使用該函數處理
示例程序:
等待接收信號代碼:
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
void my_func(int sign_no){
if(sign_no==SIGINT)
printf("SIGINT.\n");
elseif(sign_no==SIGQUIT)
printf("SIGQUIT.\n");
}
int main(){
intpid = getpid();
printf("pidis: %d\n", pid); //獲取進程的pid
signal(SIGINT, my_func);
signal(SIGQUIT, my_func);
pause();
exit(0);
}
測試代碼:
#include <stdio.h>
#include <signal.h>
int main(){
kill(4909, SIGINT); //注: 4909是上面輸出的進程pid
}
也可以使用kill命令發
kill-s SIGINT 4909或kill -s SIGQUIT 4909
也可以按Ctrl + C(SIGINT信號)或者Ctrl + \(SIGQUIT信號)