C Ubuntu 12.4上的报警系统调用

C Ubuntu 12.4上的报警系统调用,c,ubuntu,signals,virtualbox,C,Ubuntu,Signals,Virtualbox,我个人讨厌这种问题,但我被卡住了。我有一个程序正试图在Ubuntu 12.4上运行(内核:Linux 3.2.0-39-generic-pae#62 Ubuntu SMP i686 i686 i386 GNU/Linux;编译器:gcc(Ubuntu/Linaro 4.6.3-1ubuntu5)4.6.3): 停顿永远不会回来。当我在一个使用内核报告自身的系统上运行相同的代码时:Linux2.6.24-32-generic i686 GNU/Linux;编译器:gcc(gcc)4.2.4(Ubu

我个人讨厌这种问题,但我被卡住了。我有一个程序正试图在Ubuntu 12.4上运行(内核:Linux 3.2.0-39-generic-pae#62 Ubuntu SMP i686 i686 i386 GNU/Linux;编译器:gcc(Ubuntu/Linaro 4.6.3-1ubuntu5)4.6.3):

停顿永远不会回来。当我在一个使用内核报告自身的系统上运行相同的代码时:Linux2.6.24-32-generic i686 GNU/Linux;编译器:gcc(gcc)4.2.4(Ubuntu 4.2.4-1ubuntu4)使用strace运行的相同代码显示:

rt_sigaction(SIGALRM, {0x8048470, [ALRM], SA_RESTART}, {SIG_DFL}, 8) = 0
alarm(4)                                = 0
pause()                                 = ? ERESTARTNOHAND (To be restarted)
--- SIGALRM (Alarm clock) @ 0 (0) ---
write(1, "Alarm received from kernel\n", 27Alarm received from kernel
) = 27

你知道为什么Ubuntu 12.4系统从来没有收到警报,或者可以做些什么来找出发生了什么吗?

我认为问题在于信号从来没有被触发的可能性。毕竟,strace显示
rt_sigaction
返回0,表示设置信号配置成功。我认为根本没有发出信号


编辑:似乎情况就是这样。我希望@Gonzalo不介意我引用名为“SIGALRM永不开火”的虚拟箱。你说你在虚拟盒子上测试。它似乎确实反映了这种行为。

您无法从信号处理程序中安全地调用printf(),或大量其他i/o函数。它有时能工作,但不可靠。它不是异步信号安全的。请参阅以下内容以查看其他列表:

然而,它有时会“意外”起作用,使人们认为它是普遍可以接受的


请尝试在信号处理程序内部递增一个变量,然后在信号处理程序外部检查它的值是否发生了变化。

谢谢您的代码,这是一个好主意。切换它没有帮助,进程仍然无法通过pause函数。我同意这一分析,@Nate是的,很少会责怪内核(因为我们排除了编译器)。起初我怀疑它可能是内核,但后来我又不知道你在VirtualBox环境中运行,哈哈。希望您的问题现在得到解决。谢谢您的评论。我清空了bell函数的所有内容,这个过程仍然无法通过pause函数。除此之外,我看不出你所做的有任何错误,尽管我确信你不想听到这些,但它在这里工作正常,但我没有运行Ubuntu。你有没有可能在另一个系统(不是Ubuntu,其他Linux发行版)上编译它,然后复制过来看看会发生什么?可能是工具链/库问题。:)谢谢,刚刚尝试将编译后的版本从第二台机器拉到Ubuntu机器上,同样的行为正在发生。“当我在另一个系统上运行相同的代码时”,已经编译了吗?或者再次从源代码处编译它?在另一个系统上从源代码处编译你能发布每个版本和内核版本的编译器版本吗?@JorgeIsraelPeña,是的,我已经添加了它们。另外,刚刚测试了将二进制文件从ubuntu复制到其他linux系统,SIGALRM也通过了。哦,好的,那么从问题系统中获取编译后的二进制文件在其他系统上是否有效?我不喜欢喊“系统(内核、编译器等)bug”,但我不能解释其他任何事情。也许其他人有另一个想法。你编译得很简单?没有像
\u BSD\u SOURCE
这样使用的复杂makefile?
rt_sigaction(SIGALRM, {0x80484c1, [ALRM], SA_RESTART}, {SIG_DFL, [], 0}, 8) = 0
alarm(4)                                = 0
pause(
rt_sigaction(SIGALRM, {0x8048470, [ALRM], SA_RESTART}, {SIG_DFL}, 8) = 0
alarm(4)                                = 0
pause()                                 = ? ERESTARTNOHAND (To be restarted)
--- SIGALRM (Alarm clock) @ 0 (0) ---
write(1, "Alarm received from kernel\n", 27Alarm received from kernel
) = 27