Существует способ прервать вызов, не прибегая к безобразным хакерским атакам (в противоположность тому, что сказал Пол Р.).Вам следует использовать sigaction()
с sa_flags
, установленным на 0
вместо signal()
.
Кроме того, в руководстве к сигналу (2) сказано:
Избегатьего использование : вместо этого используйте sigaction (2).
#include <stdio.h>
#include <signal.h>
#include <string.h>
#include <errno.h>
static char done = 0;
static void sigHandler(int signum)
{
done = 1;
}
int user_input()
{
return (getchar() == 'q') ? 0 : 1;
}
int main(void)
{
struct sigaction sa;
memset(&sa, 0, sizeof(struct sigaction));
sa.sa_handler = sigHandler;
sa.sa_flags = 0;// not SA_RESTART!;
sigaction(SIGINT, &sa, NULL);
sigaction(SIGTERM, &sa, NULL);
while (user_input() != 0 && !done)
usleep(1000);
printf("exiting\n");
return 0;
}
Обычно, после перехвата и обработки сигнала, большинство (я не уверен, что не все) системные вызовы будут перезапущены.Таким образом, после обработки сигнала sigint ваша функция getchar будет продолжаться, как будто ничего не произошло.Вы можете изменить это поведение, вызвав sigaction с помощью sa_flags=0
.
. Таким образом, после обработки SIGINT, getchar
вернет -1
и для errno будет установлено значение «Прерванный системный вызов» (я незапомните имя константы прямо сейчас.