信號通信
產生情況:
1、當用戶按某些按鍵時,產生信號
2、硬件異常產生信號,無效存儲。
3、進程用kill函數將進程殺掉
4、用戶可以使用kill命令將信號發給其他進程
第一、信號類型
SIGHUP SIGTRAP SIGIOT SIGBUS SIGFPT
SIGINT SIGKILL SIGUSER1 SIGSEGV SIGUSER2
SIGQUIT SIGPIPE SIGALRM SIGTERM
SIGILL SIGCHLD SIGCONT SIGSTOP SIGIO SIGPWR
SIGTSTP SIGTTIN SIGTTOU SIGURG SIGPROF SIGXFSZ
SIGHUP :從終端發出結束信號
SIGINT: 來自鍵盤的中斷信號
SIGKILL: 該信號結束接收信號進程
SIGTERM: kill 命令發出的信號
SIGCHLD: 表示子進程結束,或停止
SIGSTOP:來自鍵盤ctrl-z,停止信號
第二、信號處理機制
1、忽略此信號
2、執行用戶希望的動作 信號來了,按照用戶設置處理
3、執行系統磨人的動作 一般默認都是終止該進程
信號的發送
Kill既可以向自身發送信號,也可以向其他進程發送;
raise只能向自己發送
int kill(pid_t,int signo)
int raise (int signo)
kill的pid參數四種情況
1、pid>0 將信號發送給進程ID的pid進程
2、pid==0 將信號發送給同組的進程
3、pid<0 將信號發送給其它進程id等於pid絕對的進程
4、pid==-1 堅信好發送給所有進程
第三、alarm函數的使用
alarm函數也可以發送信號,有定時作用,發送給自己!
#include<unistd.h>
unsigned int alarm (unsigned int seconds) //在未來的時間給自己發信號
int pause(void) 函數使用調用進程掛起,直到捕捉到一個信號
int pause(void) //只有等待信號處理函數後,掛起才結束
第四、signal()函數的使用
void(*signal(int signo,void(*func)(int)))(int) 返回是一個int 型的指
typedef void (*sighandler_t)(int) // 定義一個sighander函數指針
sighander_t signal(int signum,sighand_t handr)
Func可能的值是:
1、SIG_IGN 忽略此信號
2、SIG_DEF 系統默認
3、信號處理函數名 signal(int signo,void (*func)(int))可以自己
指定當信號來臨時執行的函數;
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
void my_func(int sign_no) 此函數必須只有一個參數int型
{
if(sign_no==SIGINT)
printf("I have get SIGINT\n");
else if(sign_no==SIGQUIT)
printf("I have get SIGQUIT\n");
}
int main()
{
printf("Waiting for signal SIGINT or SIGQUIT \n ");
/*註冊信號處理函數*/
signal(SIGINT, my_func);
signal(SIGQUIT, my_func);
pause();
exit(0);
}
發送信號:kill -s SIGQUIT 2324