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
  • 相关阅读:
    谷歌浏览器设置跨域失败
    Validation of viewstate MAC failed 解决办法--zt
    如何查看Oracle客户端版本及位数(Windows系统)(转)
    程序员集锦
    如何最快速地适应新的工作
    Oracle 03113
    Shell中字符串、数值的比较
    K8S客户端安装及使用
    kubectl的使用
    Helm 入门指南
  • 原文地址:https://www.cnblogs.com/yiyide266/p/13714260.html
Copyright © 2011-2022 走看看