C语言调用pause()等待信号无额外打印且可正常唤醒的解决方法
问题解答
- 你的问题本质源于
pause()函数的触发返回规则:pause()仅在捕获到信号、且对应信号处理函数执行完成并正常返回后,才会返回-1终止休眠状态。你不需要在信号处理函数中调用特殊功能函数,只需要保证mySignalHandler可以正常执行返回即可解决问题,最小可运行示例如下:
#include <signal.h> #include <unistd.h> #include <stdio.h> void mySignalHandler(int sig) { // 无额外逻辑,直接正常返回即可 return; } int main() { // 注册自定义信号处理函数覆盖默认动作 signal(SIGUSR1, mySignalHandler); printf("等待SIGUSR1信号触发...\n"); pause(); printf("已收到信号,pause()唤醒成功\n"); return 0; }
额外说明:默认SIGUSR1的处理动作是终止进程同时输出「User defined signal 1」日志,你注册自定义处理函数覆盖默认动作后,就不会再产生该类无关打印。
- 如果按上述配置修改后
pause()仍然无法唤醒,排查两个常见错误场景:- 你的信号处理函数内部调用了
_exit()、abort()、exit()这类直接终止进程的函数,导致函数没有执行到正常返回的逻辑 - 你设置了SIGUSR1的信号屏蔽位,导致发送的信号没有被进程捕获触发处理函数
- 你的信号处理函数内部调用了
内容的提问来源于stack exchange,提问作者Eric Stotch
相关产品推荐
相关产品推荐

