为何SIGALRM信号处理示例在Linux与macOS下输出不同?
Unix系统SIGALRM信号处理跨平台差异问题
正在研究Unix系统的信号处理,重点关注SIGALRM信号,编写了如下C语言测试代码:
#include <signal.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> void sig_handler(int sig) { static int beeps = 0; printf("BEEP\n"); if (beeps < 4) { beeps += 1; fork(); alarm(1); } else { printf("BOOM!\n"); exit(0); } } int main() { signal(SIGALRM, sig_handler); alarm(1); while (1); exit(0); }
该代码在**Linux 6.2.2(gcc 12.2.1,无优化)**下的输出如下:
BEEP BEEP BEEP BEEP BEEP BEEP BEEP BEEP BEEP BEEP BEEP BEEP BEEP BEEP BEEP BEEP BEEP BOOM! BEEP BOOM! BOOM! BEEP BOOM! BEEP BOOM! BEEP BOOM! BEEP BOOM! BEEP BOOM! BEEP BOOM! BEEP BOOM! BEEP BOOM! BEEP BOOM! BEEP BOOM! BEEP BOOM! BEEP BOOM!
但在**Intel架构的macOS Ventura(Apple Clang 14.0.0,无优化)**下输出差异极大:
BEEP BEEP BEEP BEEP BEEP BOOM!
已排查fork实现与反汇编结果,未发现异常优化操作。推测该差异与系统信号处理机制相关,但缺乏线索,恳请提供可参考的技术文档、手册或博客。
内容的提问来源于stack exchange,提问作者ToolmanP
相关产品推荐
相关产品推荐

