所謂的訊號就是把一個副程式註冊到系統中,當此程式接收到某一個特定的訊號時,會執行相對應的副程式。
在signal.h有定義所有的特定訊號
SIGHUP 1 /* hangup */
SIGINT 2 /* interrupt */
SIGQUIT 3 /* quit */
SIGILL 4 /* illegal instruction */
SIGABRT 6 /* used by abort */
SIGKILL 9 /* hard kill */
SIGALRM 14 /* alarm clock */
SIGCONT 19 /* continue a stopped process */
SIGCHLD 20 /* to parent on child stop or exit */
這裡介紹兩個例子:
SIGHUP:
main.c
#include <stdio.h>
#include <signal.h>
void exithandle(int sig)
{
printf("signal id=%d received\n",sig);
}
int main(int argc,char **argv)
{
// 註冊使得當此程式收到HUP的訊號時, 會執行exithandle的函式
signal(SIGHUP,exithandle);
pause();
printf("I want to leave\n");
return 0;
}
操作方式:
執行方式
先編譯程式
$ make
執行程式
$ ./main
得知目前這一個程式的process id
$ ps -u
可以尋找到目前這一個執行程式的process id
$ kill -1 pid
對目前這一個process id送出HUP訊號
就會印出目前所設定當收到HUP訊號時要執行的副程式
SIGINT:
main.c
#include <stdio.h>
#include <signal.h>
void exithandle(int sig)
{
printf("signal id=%d received\n",sig);
}
int main(int argc,char **argv)
{
// 註冊使得當此程式收到INT(ctrl+c)的訊號時, 會執行exithandle的函式
signal(SIGINT,exithandle);
pause();
printf("I want to leave\n");
return 0;
}
操作方式:
執行方式
先編譯程式
$ make
執行程式
$ ./main
當按Ctrl+c
會被系統抓到這一個訊號
參考資料:
怎樣抓獲或忽略像 control-C 這樣的鍵盤中斷?
IPC:Interrupts and Signals
沒有留言:
張貼留言