Linux 進程間通訊之信號方式

創建幾種信號:

SIGHUP: 從終端上發出的結束信號

SIGINT:來自鍵盤的中斷信號(Ctrl-C

SIGQUIT:來自鍵盤的退出信號Ctrl-\

SIGKILL:該信號結束接收信號的進程

SIGTERM: kill命令發出的信號

SIGCHLD:標識子進程停止或結束的信號

SIGSTOP:來自鍵盤(Ctrl-Z)或調試程序的停止執行信號

 

信號處理:

一、忽略此信號;(但SIGKILLSIGSTOP信號不可被忽略)

二、執行用戶希望的動作;(調用一個用戶函數,執行用戶希望的處理)

三、執行系統默認動作;(對大多數信號的系統默認動作是終止進程)

 

 

信號發送:(主要函數有killraise

區別:

         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可能的值:

1SIG_IGN:忽略此信號

2SIG_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 4909kill -s SIGQUIT 4909

也可以按Ctrl + CSIGINT信號)或者Ctrl + \SIGQUIT信號)

 

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