惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

N
Netflix TechBlog - Medium
罗磊的独立博客
云风的 BLOG
云风的 BLOG
Last Week in AI
Last Week in AI
Y
Y Combinator Blog
小众软件
小众软件
Blog — PlanetScale
Blog — PlanetScale
T
The Blog of Author Tim Ferriss
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
月光博客
月光博客
博客园 - Franky
F
Fortinet All Blogs
D
Docker
博客园 - 司徒正美
腾讯CDC
Recent Announcements
Recent Announcements
The Cloudflare Blog
B
Blog RSS Feed
GbyAI
GbyAI
T
Tailwind CSS Blog
雷峰网
雷峰网
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
博客园 - 三生石上(FineUI控件)
阮一峰的网络日志
阮一峰的网络日志

博客园 - yiyide266

[Express.js]next()函数的作用 [css]浏览器默认样式 have的实质 This comes after Chinese authorities announced an investigation against Mayday, in response to a viral video. [Linux]终端ssh远程连接如何保持 [PHP]PDO的dsn对mysql的连接影响 [PHP]回调函数参数(callable类型)的一些细节 [javascript]端序(endian)和Buffer对象的read|write系列函数 vscode处理HTML标签两个光标的问题 intend,intent和indent [css]一个块格式化上下文(BFC)阻止外边距重叠的示例 [PHP_yaf]内部注册到spl_autoload的方法 [PHP_yaf]Yaf_Application [PHP_yaf]写在用户代码的配置项 [PHP_yaf]保存在php.ini中的配置项 [PHP]spl_autoload函数栈的向下遍历机制 [英语单词]关于战争 [MySql]1820错误码重置密码方法 [Linux]信号捕捉函数与exec
[Linux]信号捕捉函数总是第一时间执行
yiyide266 · 2020-09-24 · via 博客园 - yiyide266

一、概述

如果一个程序同时有信号捕捉函数和信号相关处理的系统调用函数(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