当前位置: 技术问答>linux和unix
signal(SIGALRM,...)为什么执行不起来?
来源: 互联网 发布时间:2016-08-29
本文导语: #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); sl...
#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!
程序接着就退出了,不提示任何信息。
请问这是为什么?谢谢!
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!
程序接着就退出了,不提示任何信息。
请问这是为什么?谢谢!
|
[/code]
#include
#include
#include
#include
/* ARGSUSED */
static void catch_sigalrm(int sig)
{
(void)printf("%sn", "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;
}
|
接收到信号以后,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 );
}
|
当然只了,你只设置了执行一次时钟信号,所以只会执行一次.
sleep会被信号中断,所以也不会等待3000s,
所以你的程序现在就是不会等待的只执行一次my_sigalarm().
所以你不用惊讶 :)
sleep会被信号中断,所以也不会等待3000s,
所以你的程序现在就是不会等待的只执行一次my_sigalarm().
所以你不用惊讶 :)