#include<stdio.h>
#include<setjmp.h>
#include<signal.h>
jmp_buf env;
void alarmHandler()
{
printf("\n in alarm Handle");
longjmp(env,1);
}
int main()
{
signal(SIGALRM,alarmHandler);
alarm(2);
for(;;)
{
printf("\nhello");
sleep(1);
if(setjmp(env))
{
printf("\n inside if");
signal(SIGALRM,alarmHandler);
alarm(2);
}
}
return 0;
}
При запуске активаторы контролируют сигнал, затем активную тревогу в течение 2 секунд (обратный отсчет). Внутри цикла for
, каждый раз, он сохраняет экономию setjmp(env)
со временем заканчивается последним setjmp(env)
будет называться с использованием longjmp()
. Как setjmp()
по умолчанию возвращает 0, если вызвано из longjmp()
, что бы то ни было второе значение аргумента - это возврат значения.Почему SIGALRM не работает второй раз?
Отклоните свой код; это действительно трудно читать, когда нет отступов! –
Обратите внимание, что 'setjmp()' возвращает ноль при первом вызове и возвращает ненулевое значение, когда return из 'longjmp()'. Вы также должны закончить свой 'printf()' символом новой строки. В противном случае вывод может не отображаться. –
@JonathanLeffler сделал изменение в 'printf()' все еще не работает! – neileap