進程之間的信號通信,類型、處理機制筆記

          信號通信
產生情況:
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


 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章