一步一步学Linux C:signal 和sigaction

要对一个信号进行处理,就需要给出此信号发生时系统所调用的处理函数。可以对一个特定的信号(除去SIGKILL和SIGSTOP信号)注册相应的处理函数。注册某个信号的处理函数后,当进程接收到此信号时,无论进程处于何种状态,就会停下当前的任务去执行此信号的处理函数。

1、注册信号函数。

  1. #include<signal.h>
  2. void(*signal(int signumber,void ((*func)(int))(int)  

signumber表示信号处理函数对应的信号。func是一个函数指针。此函数有一整型参数,并返回void型。其实func还可以取其他定值如:SIG_IGN,SIG_DFL.

SIG_IGN表示:忽略signumber所指出的信号。SIG_DFL表示表示调用系统默认的处理函数。signal函数的返回值类型同参数func,是一个指向某个返回值为空并带有一个整型参数的函数指针。其正确返回值应为上次该信号的处理函数。错误返回SIG_ERR

signal示例如下:

  1. #include <stdio.h>   
  2.   
  3. #include <sys/types.h>   
  4.   
  5. #include <stdlib.h>    
  6.   
  7. #include <signal.h>    
  8.   
  9. void func(int sig)   
  10. {  
  11. printf("I get asignal!\n");  
  12. }   
  13. int main()   
  14. {    charbuffer[100];   
  15.   
  16.    if(signal(SIGINT, func) == SIG_ERR)  
  17.      {  
  18.      printf("signalerror exit now\n");  
  19.      exit(0);  
  20.      }  
  21.      printf("pid:%ld\n",(long)getpid());  
  22.   
  23.    for(;;)  
  24.   
  25.      {  
  26.   
  27.      fgets(buffer,sizeof(buffer),stdin);  
  28.   
  29.      printf("bufferis:%s\n",buffer);  
  30.   
  31.      }  
  32.  return 0;   
  33. }   

通常情况下一个用户进程需要处理多个信号。可以在一个程序中注册多个信号处理函数。一个信号可以对应一个处理函数,同时多个信号可以对应一个处理函数。

对于SIGINT信号 我们可以用ctrl+c或ctrl+z来中断进程,来执行SIGINT注册的函数。

相关推荐