• [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.
    ");
        }else{
            printf("received signal %d.
    ", signo);
        }
    }
    
    int main(void)
    {
        if(signal(SIGCHLD, sig_usr) == SIG_ERR){
            printf("cat't catch SIGCHLD.
    ");
            return 0;
        }
    
        pid_t pid = fork();
        if(pid ==-1){
            printf("Error occurred when fork.
    ");
            return 0;
        }
        if(pid == 0){
            pause();
            return 0;
        }
    
        int   status;
        pid_t pid_done = wait(&status);
        printf("pid: %d
    ", pid_done);
    
        return 0;
    }

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

    [root@localhost test]# ./a.out
    received SIGCHLD.
    pid: 3136
  • 相关阅读:
    数列分段
    2020-01-21 数组 最大子序和
    2020-01-21 数组
    补 2020-01-20 数组 删除排序数组中的重复项
    补2020-01-19 数组 两数之和
    2020-01-18 刷题 螺旋矩阵 II
    2020-01-16 刷题 长度最小的子数组
    2020-01-15 刷题 移除元素
    2020-01-14 QT学习记录
    2020-01-14 数组刷题-1
  • 原文地址:https://www.cnblogs.com/yiyide266/p/13714260.html
Copyright © 2020-2023  润新知