歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> linux信號signal處理函數(二)

linux信號signal處理函數(二)

日期:2017/2/25 10:38:16   编辑:Linux教程
 范例 #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非合法的信號編號

  五、sigdelset(從信號集裡刪除一個信號)

  相關函數 sigemptyset,sigfillset,sigaddset,sigismember

  表頭文件 #include<signal.h>

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

  函數說明 sigdelset()用來將參數signum代表的信號從參數set信號集裡刪除。

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

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

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

  六、sigemptyset(初始化信號集)

  相關函數 sigaddset,sigfillset,sigdelset,sigismember

  表頭文件 #include<signal.h>

  定義函數 int sigemptyset(sigset_t *set);

  函數說明 sigemptyset()用來將參數set信號集初始化並清空。

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

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

  七、sigfillset(將所有信號加入至信號集)

  相關函數 sigempty,sigaddset,sigdelset,sigismember

  表頭文件 #include<signal.h>

  定義函數 int sigfillset(sigset_t * set);

  函數說明 sigfillset()用來將參數set信號集初始化,然後把所有的信號加入到此信號集裡。

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

  附加說明 EFAULT 參數set指針地址無法存取

  八、sigismember(測試某個信號是否已加入至信號集裡)

  相關函數 sigemptyset,sigfillset,sigaddset,sigdelset

  表頭文件 #include<signal.h>

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

  函數說明 sigismember()用來測試參數signum 代表的信號是否已加入至參數set信號集裡。如果信號集裡已有該信號則返回1,否則返回0。

  返回值信號集已有該信號則返回1,沒有則返回0。如果有錯誤則返回-1。

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

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

  九、signal(設置信號處理方式)

  相關函數 sigaction,kill,raise

  表頭文件 #include<signal.h>

  定義函數 void (*signal(int signum,void(* handler)(int)))(int);

  函數說明 signal()會依參數signum 指定的信號編號來設置該信號的處理函數。當指定的信號到達時就會跳轉到參數handler指定的函數執行。如果參數handler不是函數指針,則必須是下列兩個常數之一:

  SIG_IGN 忽略參數signum指定的信號。

  SIG_DFL 將參數signum 指定的信號重設為核心預設的信號處理方式。

  關於信號的編號和說明,請參考附錄D

  返回值返回先前的信號處理函數指針,如果有錯誤則返回SIG_ERR(-1)。

  附加說明在信號發生跳轉到自定的handler處理函數執行後,系統會自動將此處理函數換回原來系統預設的處理方式,如果要改變此操作請改用sigaction()。

  范例 參考alarm()或raise()。

  十、sigpending(查詢被擱置的信號)

  相關函數 signal,sigaction,sigprocmask,sigsuspend

  表頭文件 #include<signal.h>

  定義函數 int sigpending(sigset_t *set);

  函數說明 sigpending()會將被擱置的信號集合由參數set指針返回。

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

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

  EINTR 此調用被中斷。

  十一、sigprocmask(查詢或設置信號遮罩)

  相關函數 signal,sigaction,sigpending,sigsuspend

  表頭文件 #include<signal.h>

  定義函數 int sigprocmask(int how,const sigset_t *set,sigset_t * oldset);

  函數說明 sigprocmask()可以用來改變目前的信號遮罩,其操作依參數how來決定

  SIG_BLOCK 新的信號遮罩由目前的信號遮罩和參數set 指定的信號遮罩作聯集

  SIG_UNBLOCK 將目前的信號遮罩刪除掉參數set指定的信號遮罩

  SIG_SETMASK 將目前的信號遮罩設成參數set指定的信號遮罩。

  如果參數oldset不是NULL指針,那麼目前的信號遮罩會由此指針返回。

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

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

  EINTR 此調用被中斷

  十二、sleep(讓進程暫停執行一段時間)

  相關函數 signal,alarm

  表頭文件 #include<unistd.h>

  定義函數 unsigned int sleep(unsigned int seconds);

  函數說明 sleep()會令目前的進程暫停,直到達到參數seconds 所指定的時間,或是被信號所中斷。

  返回值 若進程暫停到參數seconds 所指定的時間則返回0,若有信號中斷則返回剩余秒數。

Copyright © Linux教程網 All Rights Reserved