zoukankan      html  css  js  c++  java
  • [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
  • 相关阅读:
    递归练习题1
    爬虫模块之Beautiful Soup4
    python中的简易表格prettytable
    ubuntu中安装和使用quant-lib
    一个金融软件的基础功能分布
    ONLY_FULL_GROUP_BY 牛皮癣怎么治
    pandas
    pandas行筛选/列筛选(条件筛选/范围筛选)/计算
    conda 的 proxy设置
    openpyxl 安装失败的处理 (缺少 et_xmlfile )
  • 原文地址:https://www.cnblogs.com/yiyide266/p/13714260.html
Copyright © 2011-2022 走看看