返回顶部

收藏

linux c signal 和sigaction

更多

1、注册信号函数。

#include<signal.h>  

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示例如下:

#include <stdio.h>  

#include <sys/types.h>  

#include <stdlib.h>   

#include <signal.h>   

void func(int sig)   
{  
printf("I get asignal!\n");  
}   
int main()   
{    charbuffer[100];   

   if(signal(SIGINT, func) == SIG_ERR)  
     {  
     printf("signalerror exit now\n");  
     exit(0);  
     }  
     printf("pid:%ld\n",(long)getpid());  

   for(;;)  

     {  

     fgets(buffer,sizeof(buffer),stdin);  

     printf("bufferis:%s\n",buffer);  

     }  
 return 0;   
}   

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

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

2、 高级信号处理。 在linux系统提供了一个功能更强的系统调用。

#include <signal.h>  

int sigaction(int signumbet,const structsigaction *act,struct sigaction *oldact)  

                                 此函数除能注册信号函数外还提供了更加详细的信息,确切了解进程接收到信号,发生的具体细节。

struct sigaction;的定义如下:在linux2.6.39/include/asm-generic/signal.h中实现

struct sigaction  

{  

     void(*sa_handler)(int);  

     void(*sa_sigaction)(int,siginfo_t *,void *);  

     sigset_tsa_mask;  

     intsa_flags;  

}  

siginfo_t在linux2.6.39/include/asm-generic/siginfo.h中实现:

sa_flags的取值如下表,取0表示选用所有默认选项。 SA_NOCLDSTOP:用于表示信号SIGCHLD,当子进程被中断时,不产生此信号,当且仅当子进程结束时产生此信号。 SA_NOCLDWATI:当信号为SIGCHLD,时可避免子进程僵死。 SA_NODEFER:当信号处理函数正在进行时,不堵塞对于信号处理函数自身信号功能。 SA_NOMASK:同SA_NODEFER SA_ONESHOT:当用户注册的信号处理函数被执行过一次后,该信号的处理函数被设为系统默认的处理函数。 SA_RESETHAND:同SA_ONESHOT SA_RESTART:是本来不能重新于运行的系统调用自动重新运行。 SA_SIGINFO:表明信号处理函数是由SA_SIGACTION指定的,而不是由SA_HANDLER指定的,它将显示更多的信号处理函数信息。

其实sinaction完全可以替换signal函数

#include <stdio.h>   
#include <sys/types.h>   
#include <stdlib.h>    
#include <signal.h>    

void func(int sig)    

{  

printf("I get a signal!\n");   

}    

int main()    

{   char buffer[100];    

    struct sigaction act;  
    act.sa_handler=func;  
    sigemptyset(&act.sa_mask);  
    act.sa_flags = 0;  

    if(sigaction(SIGINT,&act, NULL) == -1)  
    {  
    printf("sigaction error exit now\n");  
    exit(0);  
    }  

    printf("pid:%ld\n",(long)getpid());   

    for(;;)  
    {  
    fgets(buffer,sizeof(buffer),stdin);  
    printf("buffer is:%s\n",buffer);  
    }  

    return 0;    

}    

标签:signal,sigaction,linux,c

收藏

0人收藏

支持

0

反对

0

发表评论