Я пытаюсь написать обработчик сигналов, чтобы перехватывать любое количество последовательных сигналов SIGINT и предотвращать выход из программы. Программа представляет собой простой файловый сервер. Обработчик устанавливает глобальный флаг, который приводит к завершению цикла while, принимающего новые соединения, вызов pthread_exit () гарантирует, что main разрешает текущим соединениям завершиться до выхода. Все идет как по маслу, когда я нажимаю ctrl-C один раз, но второй раз немедленно покидаю программу.
Сначала я попробовал с сигналом ():
signal(SIGINT, catch_sigint);
...
static void catch_sigint(int signo)
{
...
signal(SIGINT, catch_sigint);
}
Я тоже пробовал, используя sigaction:
struct sigaction sigint_handler;
sigint_handler.sa_handler = catch_sigint;
sigemptyset(&sigint_handler.sa_mask);
sigint_handler.sa_flags = 0;
sigaction(SIGINT, &sigint_handler, NULL);
Не знаю, как «переустановить» этот код. Я просто продублировал этот код в обработчике, аналогичном обработчику с использованием метода signal ().
Ни одна из этих работ, как я ожидал.
Дополнительная информация:
Программа представляет собой простой файловый сервер. Он получает запрос от клиента, который представляет собой просто строку, состоящую из запрошенного имени файла. Он использует pthreads, чтобы передачи могли происходить одновременно. После получения SIGINT я хочу, чтобы сервер вышел из цикла while и дождался завершения всех текущих передач, а затем их закрытия. Таким образом, независимо от того, как я кодирую обработчик сигнала, второй SIGINT немедленно завершает программу.
int serverStop = 0;
...
int main()
{
/* set up the server -- socket(), bind() etc. */
struct sigaction sigint_hadler;
sigint_handler.sa_handler = catch_sigint;
sigint_handler.sa_flags = 0;
sigemptyset(&sigint_handler.sa_mask);
sigaction(SIGINT, &sigint_handler, NULL);
/* signal(SIGINT, catch_sigint); */
while(serverStop == 0)
{
/* accept new connections and pthread_create() for each */
}
pthread_exit(NULL);
}
...
static void catch_sigint(int signo)
{
serverStop = 1;
/* signal(SIGINT, catch_sigint) */
}
Я не думаю, что какой-либо другой код может быть уместным, но не стесняйтесь просить проработки