unix信号

unix信号有1~63个,其中1~31是传统信号,是不可靠(非实时)信号,32~63是可靠(实时)信号,不可靠和可靠信号的区别是不可靠信号多次发送会造成排队,N个相同信号,排队后会变成1个信号。可靠信号N次发送经过排队后,处理时仍是N个信号。

例如N个SIGINT(2)+M个SIGQUIT(3),经过排队后,变成了1个SIGINT+1个SIGQUIT信号。

N个SIGRTMIN(34) 经过排队后还是N个SIGRTMIN信号。

 

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

void signal_handler(int signo);

int main(void) {

    sigset_t set;
    sigemptyset(&set);
    sigaddset(&set, SIGINT);
    sigaddset(&set, SIGRTMIN);
    sigaddset(&set, SIGQUIT);
    sigprocmask(SIG_BLOCK, &set, NULL);


    struct sigaction sa;

    memset(&sa, 0, sizeof(struct sigaction));
    sa.sa_handler = signal_handler;

    sigemptyset(&sa.sa_mask);
    sigaction(SIGINT, &sa, NULL);
    sigaction(SIGRTMIN, &sa, NULL);
    sigaction(SIGQUIT, &sa, NULL);


    int count = 0;
    while (1) {
        if (count >= 100) {
            break;
        }

        printf("sleep...%d\n", count);
        sleep(1);

        if (count > 0 && count % 20 == 0) {
            printf("挂起等待信号...\n");
            sigemptyset(&set);
            sigsuspend(&set);
        }

        count++;
    }

}

void signal_handler (int signo) {
    if (signo == SIGINT) {
        printf("catch signal SIGINT:%d\n", signo);
    } else if (signo == SIGRTMIN) {
        printf("catch signal SIGRTMIN:%d\n", signo);
    } else if (signo == SIGQUIT) {
        printf("catch siganl SIGQUIT:%d, exit...\n", signo);
        //exit(0);
    } else {
        printf("catch signal:%d\n", signo);
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值