一、信號
信號(signal)機制是Unix進程間通信的一種機制。很多條件可以產生信號。
進程可以用kill 函數將信號發送給另一個進程,用戶可以用kill命令發送信號。
信號有三種處理方式:
1、忽略信號。通常情況下都按這種方式進行處理,但SIGKILL和SIGSTOP不能被忽略。
2、執行用戶定義的動作。調用用戶定義的函數,執行用戶希望的處理。
3、執行系統默認操作。通常爲終止該進程。
二、信號的發送
頭文件爲<signal.h>
int kill(pid_t pid, int signo)
pid參數:
pid>0:發送給進程ID爲pid的進程
pid==0: 發送給同組進程
pid<0: 發送給進程組ID等於pid絕對值的進程
pid == -1: 發送給所有進程
int raise(int signo) // 只能向自身發信號
unsigned int alarm(unsigned int seconds) //頭文件爲<unistd.h>
經過sec秒後產生SIGALRM信號,後調用的alarm會更新先前的。如果後調用的sec爲0則取消先前的alarm。
int pause() 將程序掛起,直到捕捉到一個信號。
三、信號的處理
void (*signal(int signo, void (*func)(int)))(int)
啊..... 這個函數,有點微亂。就對付看吧,一般是看不懂。
就這麼理解吧:signal(signo, Func)
Func 可以是
SIG_IGN: 忽略此信號
SIG_DFL:系統默認方式處理
信號處理函數名: 使用該函數處理
四、舉例
- #include<stdio.h>
- #include<signal.h>
- void receive(int sign){
- if(sign == SIGINT){
- printf("Receive the SIGINT!!!\n");
- }
- }
- main(){
- signal(SIGINT,receive);
- printf("waiting for the Mgs.....\n");
- pause();
- }
#include<stdio.h> #include<signal.h> void receive(int sign){ if(sign == SIGINT){ printf("Receive the SIGINT!!!\n"); } } main(){ signal(SIGINT,receive); printf("waiting for the Mgs.....\n"); pause(); }
通過ps -aux命令找到相應的進程。以root權限,用 ps -s SIGINT PID號 命令即可向進程發送信號。