标签:函数 printf pid 捕捉 信号 Linux 进程 SIGCHLD
一、概述
如果一个程序同时有信号捕捉函数和信号相关处理的系统调用函数,那么程序优先执行哪个呢?
答案是信号捕捉函数;
信号捕捉函数总是在进程接到信号(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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。