У меня проблема с SIGALRM, которая, кажется, не запускается. Я использую signal(), а не sigaction() для простоты кода.
Цель состоит в том, чтобы иметь некоторый цикл, который читает, но через x секунд повторно инициализирует все переменные перед повторным чтением. Я использую для этого будильник.
volatile sig_atomic_t restartBool;
void catch_alarm(int sig)
{
fprintf(stderr, "ALARM CALLED\n");
restartBool = 1;
}
int main(void)
{
int n, fd_in = 0;
char newChar;
signal(SIGALRM, catch_alarm);
while (1) { /* main loop */
restartBool = 0;
// Set a timer before we start reading
alarm(2);
while (restartBool == 0 && (n = read(fd_in, &newChar, 1)) == 1) { /* parse input */
/* ..... */
}
fprintf(stderr, "EXITED THE LOOP");
// Cancel the alarm/timer
alarm(0);
}
}
Что ж, оператор fprintf() в функции catch_alarm() никогда не вызывается, и я не уверен, почему (я работаю в Linux).
Любая помощь будет отличной,
Большое Вам спасибо,
Джари
int n, fd_in=0, newChar;
в началоmain
, он работает нормально (сообщение печатается). - person R.. GitHub STOP HELPING ICE   schedule 08.02.2011fprintf
не является реентерабельным: вызывать из обработчика сигнала небезопасно, потому что вы можете находиться в середине вызова к нему, когда сигнал доставлен. - person Adam Rosenfield   schedule 08.02.2011sleep
или что-то подобное в цикле while? - person Hasturkun   schedule 08.02.2011fprintf
не является безопасным для асинхронных сигналов, но, похоже, это не проблема. Конечно, если вы вызовете неопределенное поведение таким образом, может произойти что угодно, но в реальном мире почти наверняка произойдет сбой или взаимоблокировка. Если вы хотите проверить, в этом ли проблема, используйте write(2, message\n, 8); вместоfprintf
в обработчике сигнала. - person R.. GitHub STOP HELPING ICE   schedule 08.02.2011