signal()函数

signal()函数

例子

#include<stdio.h>
#include<signal.h>
#include <unistd.h>

typedef sighandler_t SignalHandler;

static SignalHandler g_handler1Pre=NULL;
static SignalHandler g_handler2Pre=NULL;
static SignalHandler g_handler3Pre=NULL;

void  handler1(int signo)
{
    printf("handler1 catch a signal: %d\n",signo);
    if(g_handler1Pre != NULL) {
        g_handler1Pre(signo);
    } else {
        printf("g_handler1Pre is null.\n");
    }        
}

void  handler2(int signo)
{
    printf("handler2 catch a signal: %d\n",signo);
    if(g_handler2Pre != NULL) {         
        g_handler2Pre(signo);
    } else {
        printf("g_handler2Pre is null.\n");
    } 
}

int main()
{
    printf("register handler1.\n");
    if (g_handler1Pre = signal(2,handler1)){
        if (g_handler1Pre == SIG_DFL) {
            printf("g_handler1Pre is SIG_DFL.\n");
            return -1;
        }
        
        if (g_handler1Pre == SIG_IGN) {
            printf("g_handler1Pre is SIG_IGN.\n");
            return -1;
        }
        
        if (g_handler1Pre == SIG_ERR) {
            printf("g_handler1Pre is SIG_ERR.\n");
            return -1;
        }        
    }
    
    
    printf("register handler2.\n");
    if (g_handler2Pre = signal(2,handler1)){
        if (g_handler2Pre == SIG_DFL) {
            printf("g_handler2Pre is SIG_DFL.\n");
            return -1;
        }
        
        if (g_handler2Pre == SIG_IGN) {
            printf("g_handler2Pre is SIG_IGN.\n");
            return -1;
        }
        
        if (g_handler2Pre == SIG_ERR) {
            printf("g_handler2Pre is SIG_ERR.\n");
            return -1;
        }        
    }
        
    while(1)
    {
        printf("running...\n");
        sleep(1);
    }
    return 0;
}


执行结果

$ ./a.out
register handler1.
register handler2.
running...
running...
running...
^Chandler1 catch a signal: 2
g_handler1Pre is null.
running...
running...
^Z
[10]+  Stopped 

signal函数解释

//向信号量sig注册一个处理函数func
sighandler_t signal(int sig, void (*func)(int))

两个参数:

  1. 信号量
  2. 信号处理函数

返回值可能为

  1. SIG_DFL(默认的信号处理程序)
  2. SIG_IGN(忽视信号)
  3. SIG_ERR(信号错误)
  4. 之前的信号处理函数

查看信号量

$ kill -l
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
 6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1
11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM
16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR
31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值