2011年12月7日 星期三

C / C++ Singal


這裡介紹如何使用訊號~
所謂的訊號就是把一個副程式註冊到系統中,當此程式接收到某一個特定的訊號時,會執行相對應的副程式。

在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

沒有留言: