signal(SIGALRM,...)为什么执行不起来?

uuussseeennn 2010-05-24 09:34:12
#define ALARM_SLEEP 1

void my_sigalarm(int sig) {
printf("sigalarm!\n");
alarm(ALARM_SLEEP);
signal(SIGALRM, my_sigalarm);
}

int main(int argc, char* argv[]) {
signal(SIGALRM, my_sigalarm);
alarm(ALARM_SLEEP);
sleep(3000);

return 0;
}

上面的代码在ARM板子上面一跑,只输出一行:
sigalarm!
程序接着就退出了,不提示任何信息。

请问这是为什么?谢谢!
...全文
852 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
激情的头发 2010-05-25
  • 打赏
  • 举报
回复
接收到信号以后,SLEEP会被中断。所以,在信号处理程序执行完后,程序从SLEEP被中断后开始执行。程序就此退出了。如果想要不使程序退出的话,应该将alarm放到死循环中。

/* Install signal handler */
signal( SIGALRM, handler );

/* Suspend signal SIGSEGV */
sigset_t mask;
sigemptyset( &mask );
sigaddset( &mask, SIGSEGV );

while ( 1 )
{
alarm( 1 );
sigsuspend( &mask );
}
yanjinbin0 2010-05-25
  • 打赏
  • 举报
回复
当然只了,你只设置了执行一次时钟信号,所以只会执行一次.
sleep会被信号中断,所以也不会等待3000s,
所以你的程序现在就是不会等待的只执行一次my_sigalarm().
所以你不用惊讶 :)
sabflying 2010-05-25
  • 打赏
  • 举报
回复
[Quote=引用楼主 uuussseeennn 的回复:]
#define ALARM_SLEEP 1

void my_sigalarm(int sig) {
printf("sigalarm!\n");
alarm(ALARM_SLEEP);
signal(SIGALRM, my_sigalarm);
}

int main(int argc, char* argv[]) {
signal(SIGALRM, my_si……
[/Quote]


第一次被唤醒后就退出了,当然只执行一次
howema 2010-05-25
  • 打赏
  • 举报
回复
楼上说的没错!
once_and_again 2010-05-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 mymtom 的回复:]

[/code]
C/C++ code

#include <sys/time.h>
#include <signal.h>
#include <unistd.h>

#include <stdio.h>

/* ARGSUSED */
static void catch_sigalrm(int sig)
{
(void)printf("%s\n", "SIGALRM rece……
[/Quote]

学习
mymtom 2010-05-25
  • 打赏
  • 举报
回复
[/code]

#include <sys/time.h>
#include <signal.h>
#include <unistd.h>

#include <stdio.h>

/* ARGSUSED */
static void catch_sigalrm(int sig)
{
(void)printf("%s\n", "SIGALRM received.");
}

static void (*Signal (int sig, void (*handler)(int)))(int)
{
struct sigaction act, oact;

act.sa_handler = handler;
act.sa_flags = 0;
#ifdef SA_INTERRUPT
act.sa_flags |= SA_INTERRUPT;
#endif
if (sigaction(sig, &act, &oact))
return SIG_ERR;

return oact.sa_handler;
}

int main(void)
{
struct itimerval it;

(void)Signal(SIGALRM, &catch_sigalrm);
it.it_interval.tv_sec = 1;
it.it_interval.tv_usec = 0;
it.it_value.tv_sec = 1;
it.it_value.tv_usec = 0;
(void)setitimer(ITIMER_REAL, &it, NULL);

/* CONSTCOND */
for (;;)
(void)pause();

/* NOTREACHED */
return 0;
}

mymtom 2010-05-25
  • 打赏
  • 举报
回复
[/code]
这么复杂,还是改用sigaction和setitimer好了。
[code=C/C++]
#include <sys/time.h>
#include <signal.h>
#include <unistd.h>

#include <stdio.h>

/* ARGSUSED */
static void catch_sigalrm(int sig)
{
(void)printf("%s\n", "SIGALRM received.");
}

static void (*Signal (int sig, void (*handler)(int)))(int)
{
struct sigaction act, oact;

act.sa_handler = handler;
act.sa_flags = 0;
#ifdef SA_INTERRUPT
act.sa_flags |= SA_INTERRUPT;
#endif
if (sigaction(sig, &act, &oact))
return SIG_ERR;

return oact.sa_handler;
}

int main(void)
{
struct itimerval it;

(void)Signal(SIGALRM, &catch_sigalrm);
it.it_interval.tv_sec = 1;
it.it_interval.tv_usec = 0;
it.it_value.tv_sec = 1;
it.it_value.tv_usec = 0;
(void)setitimer(ITIMER_REAL, &it, NULL);

/* CONSTCOND */
for (;;)
(void)pause();

/* NOTREACHED */
return 0;
}

23,220

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧