Linux 信号捕捉函数 signal sigaction

signal函数

    #include <signal.h>

    typedef void (*sighandler_t)(int);

    sighandler_t signal(int signum, sighandler_t handler);

    功能:设置某个信号的捕捉行为

    参数:

        -signum:要捕捉的信号

        handler:对捕捉到的信号怎么处理

            -SIG_IGN:忽略信号

            -SIG_DFL:使用函数默认的行为

            -回调函数,程序员只负责写,捕捉到信号后如何区处理

                -需要程序员实现,提前准备好的,函数的类型根据实际需求,看函数指针的定义

                -不是程序员调用,而是当信号产生,内核调用

                -函数指针是实现回调的手段,函数实现之后,将函数名放到函数指针的位置就好了

    返回值:

        成功:返回上一次注册的信号处理函数的地址。第一次调用返回NULL

        失败:返回SIG_ERR,设置错误号

    SIGKILL 和 SIGSTOP不能被捕捉也不能被忽略

*/

#include <sys/time.h>
#include<stdio.h>
#include<unistd.h>
#include<signal.h>

void myalarm(int num) {
    printf("捕捉到的信号的编号为 %dn", num);
    printf("xxxxxxxxxxxxn");
}

int main() {
    signal(SIGALRM, myalarm);
    struct itimerval new_value;
    new_value.it_interval.tv_sec = 2;
    new_value.it_interval.tv_usec = 0;
    new_value.it_value.tv_sec = 3;
    new_value.it_value.tv_usec = 0;
    int ret = setitimer(ITIMER_REAL, &new_value, NULL);
    printf("开始n");
    if(ret == -1) {
        perror("ret");
        return 0;
    }
    while(1) {
        printf("1n");
       sleep(1);
    }
    return 0;
}

sigaction函数

#include <signal.h>

int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);

功能:检查或者改变信号的处理  信号捕捉

参数:-signum:要捕捉的信号的编号或者宏值

         -act 捕捉到信号之后的处理动作

         -oldact:上一次对信号捕捉相关的设置,一般不用,输入NULL

返回值:成功0失败-1

    struct sigaction {

               void     (*sa_handler)(int);  函数指针,指向的函数就是信号捕捉到之后的处理函数

               void     (*sa_sigaction)(int, siginfo_t *, void *);  不常用  同上

               sigset_t   sa_mask;  临时阻塞信号集,在信号捕捉函数执行过程中阻塞某些信号

               int        sa_flags;  指定是使用第一个参数还是第二个参数对信号进行处理 0表示使用sa_handler  siginfo表示第二个

               void     (*sa_restorer)(void);

           };

#include <sys/time.h>
#include<stdio.h>
#include<unistd.h>
#include<signal.h>

void myalarm(int num) {
    printf("捕捉到的信号的编号为 %dn", num); 
    printf("xxxxxxxxxxxxn");
}

int main() {

    struct sigaction act;
    act.sa_handler = 0;
    act.sa_handler = myalarm;
    sigemptyset(&act.sa_mask);
    sigaction(SIGALRM, &act, NULL);

    struct itimerval new_value;
    new_value.it_interval.tv_sec = 2;
    new_value.it_interval.tv_usec = 0;
    new_value.it_value.tv_sec = 3;
    new_value.it_value.tv_usec = 0;
    int ret = setitimer(ITIMER_REAL, &new_value, NULL);
    printf("开始n");
    if(ret == -1) {
        perror("ret");
        return 0;
    }
    while(1) {
        printf("1n");
        sleep(1);
    }
    return 0;
}

尽可能使用sigaction     signal是美国那边编译的每个版本不太一样