[Linux]信号捕捉函数总是第一时间执行

一、概述

如果一个程序同时有信号捕捉函数和信号相关处理的系统调用函数(wait, pause等等),那么程序优先执行哪个呢?

答案是信号捕捉函数;

信号捕捉函数总是在进程接到信号(Delivery)那一刻第一时间执行的,在函数返回后(如果它之内没有exit或jump的话)再去执行信号相关处理的系统调用;

二、示例

这段程序父进程安排了捕捉SIGCHLD信号后fork一个子进程,子进程pause,父进程调用wait函数等待子进程结束:

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

static void sig_usr(int signo)
{
    if(signo == SIGCHLD){
        printf("received SIGCHLD.\n");
    }else{
        printf("received signal %d.\n", signo);
    }
}

int main(void)
{
    if(signal(SIGCHLD, sig_usr) == SIG_ERR){
        printf("cat't catch SIGCHLD.\n");
        return 0;
    }

    pid_t pid = fork();
    if(pid ==-1){
        printf("Error occurred when fork.\n");
        return 0;
    }
    if(pid == 0){
        pause();
        return 0;
    }

    int   status;
    pid_t pid_done = wait(&status);
    printf("pid: %d\n", pid_done);

    return 0;
}

子进程pause后,向它发出一个信号,子进程退出,父进程首先是运行了信号捕获函数,然后再从wait返回:

[root@localhost test]# ./a.out
received SIGCHLD.
pid: 3136

 

posted @ 2020-09-24 09:30  yiyide266  阅读(160)  评论(0编辑  收藏  举报