1.核心理論
信號:在linux中信號是一個古老的進程間的通訊機制,就像古代烽火臺所起到的傳遞信號的作用一樣。
信號處理流程
信號通訊機制就分爲三步:選擇信號→發送信號→處理信號信號類型
linux系統支持的所有信號均定義在usr/include/asm/signal.h中,其中常見的信號有:
SIGKILL:殺死進程
SIGSTOP:暫停進程
SIGCHLD:子進程停止貨結束時用來通知父進程。
2.函數學習:
發送信號函數:
函數名:kill
函數原型:int kill (pid_t pid, int sig)
頭文件:sys/types.h signal.h
功能:發送信號給一個進程
返回值:成功返回0,失敗返回-1或者errno
參數:pid:要發送信號的進程,sig:發送的信號。處理信號函數:
函數名:signal
函數原型:typedef void(*sighandler_t)(int)
sighandler_t signal(int signum , sighandler_t handler)
頭文件:signal.h
功能:設置信號的處理方式
返回值:成功返回的是處理函數的指針,失敗返回的值SIG_ERR
參數:signum:要處理的信號
handler:信號的處理方式
可設置的方式:
SIG_IGN忽視這個信號,
SIG_DEL:交給內核處理,
用戶自定義的函數:交給用戶處理函數處理
3.信號通信實例
實例中用到的函數
pause:等待進程發送函數。
atoi:將字符串轉化成整型。發送進程
#include <sys/types.h>
#include <signal.h>
#include <stdio.h>
void main(int argc,char *argv[])
{
pid_t pid;
pid = atoi(argv[1]);
kill(pid,SIGINT);
}
注意:關於參數argc和argv[],前者是參數的個數,後者是要傳遞的參數名argc[0]是函數名,後面纔是傳遞的參數。
- 處理進程
#include <unistd.h>
#include <signal.h>
void myfunc(int a)
{
printf("process B recieve SIGINT\n");
}
void main()
{
signal(SIGINT,myfunc);
pause();
}
程序的執行過程:
首先打開b(處理函數進程)進程:./bprocess
然後發送信號:kill -n SIGINT b進程的進程號
執行結果:打印出process B recieve SIGINT