Я запускаю свою программу на Mac OS. Часть моей программы следующая. Этот код хорошо работает по сигналу sigint, но не может работать с сигналом сигкилла.В C, linux, о сигнале kill и sleep() в цикле
void sigkill(int sig){
/*some code neglected*/
exit(0);
}
void sigint(int sig){
flag=1;
}
void alive(void) {
signal(SIGINT, sigint);
signal(SIGKILL, sigkill);
alarm(10);
while(1){
//printf("%d\n",flag);
sleep(1);
if(flag==1){
printf("no\n");
flag=0;
}
}
}
У меня есть четыре вопроса:
На первых я не писал
sleep(1)
, он может ввести функцию SIGINT(), и изменить значение флага, я могу видеть из Printf. Однако, как я и ожидал, нет «нет».После того, как я добавил функцию сна, он работает хорошо. Я предполагаю, что цикл while проверяет флаг каждые 1 секунду и выводит «нет», если флаг = 1. Однако, кажется, что «нет» выход каждый раз, когда я нажимаю ctrl + c. Почему он не ждет одну секунду?
Вопрос: «Вы не должны использовать« sleep() »для ожидания 10 секунд. Используйте будильник() в сочетании с циклом». Я хочу знать, как реализовать это без сна().
Команда kill не может вызвать функцию sigkill, как исправить это?
Вы не можете использовать ловушку 'SIGKILL' - период. Вы не можете установить ловушку для 'SIGKILL'. Тоже 'SIGSTOP', кстати. –
Знаете ли вы, как реализовать его без сна()? –
Смешивание 'alarm()' и 'sleep()' не на 100% надежное. Вы можете использовать 'alarm()' и 'pause()' - 'pause()' только возвращается, когда он прерывается, и обработчик сигнала возвращается. Вы можете использовать 'select()' и 'poll()' и варианты, специфичные для платформы, для выполнения второстепенных снов. Вы можете использовать 'nanosleep()' и 'usleep()' для выполнения спящего режима nano-second и micro-second (хотя точность, как правило, не так хороша, как разрешение). Если вы будете выглядеть тяжело, там, вероятно, будет миллисекунда. –