歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> linux常用c函數:信號處理篇(二)

linux常用c函數:信號處理篇(二)

日期:2017/2/25 10:38:48   编辑:Linux教程
 如參數結構sigaction定義如下

  struct sigaction

  {

  void (*sa_handler) (int);

  sigset_t sa_mask;

  int sa_flags;

  void (*sa_restorer) (void);

  }

  sa_handler此參數和signal()的參數handler相同,代表新的信號處理函數,其他意義請參考signal()。

  sa_mask 用來設置在處理該信號時暫時將sa_mask 指定的信號擱置。

  sa_restorer 此參數沒有使用。

  sa_flags 用來設置信號處理的其他相關操作,下列的數值可用。

  OR 運算(|)組合

  A_NOCLDSTOP : 如果參數signum為SIGCHLD,則當子進程暫停時並不會通知父進程

  SA_ONESHOT/SA_RESETHAND:當調用新的信號處理函數前,將此信號處理方式改為系統預設的方式。

  SA_RESTART:被信號中斷的系統調用會自行重啟

  SA_NOMASK/SA_NODEFER:在處理此信號未結束前不理會此信號的再次到來。

  如果參數oldact不是NULL指針,則原來的信號處理方式會由此結構sigaction 返回。

  返回值 執行成功則返回0,如果有錯誤則返回-1。

  錯誤代碼 EINVAL 參數signum 不合法, 或是企圖攔截SIGKILL/SIGSTOPSIGKILL信號

  EFAULT 參數act,oldact指針地址無法存取。

  EINTR 此調用被中斷

  范例 #include<unistd.h>

  #include<signal.h>

  void show_handler(struct sigaction * act)

  {

  switch (act->sa_flags)

  {

  case SIG_DFL:printf(“Default action\n”);break;

  case SIG_IGN:printf(“Ignore the signal\n”);break;

  default: printf(“0x%x\n”,act->sa_handler);

  }

  }

  main()

  {

  int i;

  struct sigaction act,oldact;

  act.sa_handler = show_handler;

  act.sa_flags = SA_ONESHOT|SA_NOMASK;

  sigaction(SIGUSR1,&act,&oldact);

  for(i=5;i<15;i++)

  {

  printf(“sa_handler of signal %2d =”.i);

  sigaction(i,NULL,&oldact);

  }

  }

  執行 sa_handler of signal 5 = Default action

  sa_handler of signal 6= Default action

  sa_handler of signal 7 = Default action

  sa_handler of signal 8 = Default action

  sa_handler of signal 9 = Default action

  sa_handler of signal 10 = 0x8048400

  sa_handler of signal 11 = Default action

  sa_handler of signal 12 = Default action

  sa_handler of signal 13 = Default action

  sa_handler of signal 14 = Default action

  sigaddset(增加一個信號至信號集)

  相關函數 sigemptyset,sigfillset,sigdelset,sigismember

  表頭文件 #include<signal.h>

  定義函數 int sigaddset(sigset_t *set,int signum);

  函數說明 sigaddset()用來將參數signum 代表的信號加入至參數set 信號集裡。

  返回值 執行成功則返回0,如果有錯誤則返回-1。

  錯誤代碼 EFAULT 參數set指針地址無法存取

  EINVAL 參數signum非合法的信號編號

Copyright © Linux教程網 All Rights Reserved