【发布时间】:2013-04-01 02:01:52
【问题描述】:
我个人讨厌这类问题,但我被困住了。我有一个程序要在 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):
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
/*
* sleep1.c
* purpose show how sleep works
* usage sleep1
* info sets handler, sets alarm, pauses, then returns
*/
int main()
{
void onbell(int);
printf("about to sleep for 4 seconds\n");
signal(SIGALRM, onbell); /* catch it */
alarm(4); /* set clock */
pause(); /* do nothing */
printf("Morning so soon?\n"); /* back to work */
return 0;
}
void
onbell(int s)
{
printf("Alarm received from kernel\n");
}
问题是,SIGALRM 永远不会通过。如果我在上面运行 strace,最后三行是:
rt_sigaction(SIGALRM, {0x80484c1, [ALRM], SA_RESTART}, {SIG_DFL, [], 0}, 8) = 0
alarm(4) = 0
pause(
暂停永远不会回来。当我在使用 Kernal 报告自身的系统上运行相同的代码时:Linux 2.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 系统上从来没有收到警报,或者可以做些什么来弄清楚发生了什么?
【问题讨论】:
-
“当我在另一个系统上运行相同的代码时”,已经编译了吗?还是再次从源代码编译?
-
在其他系统上从源代码编译
-
你能发布每个内核版本的编译器版本吗?
-
@JorgeIsraelPeña,是的,我添加了它们。还刚刚测试了将二进制文件从 ubuntu 复制到其他 linux 系统并且 SIGALRM 正在通过那里。
-
哦,好吧,那么从问题系统中获取已编译的二进制文件在其他系统上是否有效?我不热衷于哭泣“系统(内核,编译器等)错误”,但我无法解释其他任何事情。也许其他人有另一个想法。你编译的很简单?没有像
_BSD_SOURCE这样可能使用feature test macros 的复杂makefile?
标签: c ubuntu signals virtualbox