[Linux]信号捕捉函数总是第一时间执行
作者:互联网
一、概述
如果一个程序同时有信号捕捉函数和信号相关处理的系统调用函数,那么程序优先执行哪个呢?
答案是信号捕捉函数;
信号捕捉函数总是在进程接到信号(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
标签:函数,printf,pid,捕捉,信号,Linux,进程,SIGCHLD 来源: https://www.cnblogs.com/yiyide266/p/13714260.html