C语言编写的SIGUSR1信号触发代码运行后无对应输出如何解决
错误原因
- 核心问题:
main函数在完成SIGUSR1信号处理函数的注册后直接执行return 0退出了进程,进程没有停留等待信号发送,自然无法触发对应的处理逻辑。 - 额外规范问题:信号处理函数内调用
printf属于不安全操作,printf是不可重入的标准IO函数,不属于异步信号安全函数,在信号处理上下文调用可能出现意料之外的异常。
修复方法
让进程在注册信号后保持运行状态等待信号接收即可,比如通过pause()函数挂起进程,参考修复代码如下:
#include <signal.h> #include <stdio.h> #include <unistd.h> // 引入pause、getpid所需的头文件 void my_handler(int signum) { // 此处仅做演示,实际场景避免在信号处理函数中调用标准IO函数 printf("Hello\n"); printf("%d\n", signum); if (signum == SIGUSR1) { printf("Received\n"); } } int main() { printf("Starting... 当前进程PID为:%d\n", getpid()); signal(SIGUSR1, my_handler); pause(); // 挂起进程,直到接收到信号才会继续执行 return 0; }
修复后运行程序,另开终端执行命令kill -SIGUSR1 你程序的PID,就能看到信号处理函数的输出内容。
内容的提问来源于stack exchange,提问作者Kinnturo
相关产品推荐
相关产品推荐

