Не удалось поймать сигнал SIGINT при использовании select ()

Я определил свой собственный обработчик сигналов для SIGINT. Но мой обработчик сигнала не вызывается. Обработчик сигнала просто завершает программу. Но при нажатии ctrl + c программа не закрывается. Пожалуйста помоги...

Вот так выглядит код ..

sa.sa_handler = handle_termsig;
sa.sa_flags = 0;
sigemptyset(&sa.sa_mask);
sigaction(SIGINT, &sa, 0);
sigaction(SIGTERM, &sa, 0);
sigemptyset(&g_termsigs);
sigaddset(&g_termsigs, SIGINT);
sigaddset(&g_termsigs, SIGTERM);

sigprocmask(SIG_BLOCK, &g_termsigs, 0);
if (select (fdmax+1, &rd, &wr, NULL, &time) < 0)
{
  exit();
}
sigprocmask(SIG_UNBLOCK, &g_termsigs, &savemask);

Ответов (2)

Поскольку SIGINT блокируется во время вызова select, он не доставляется и select() не прерывается. Если ваш обработчик просто вызывает, exit() а вы хотите этого, даже когда ваш код вызывает select, лучшим решением было бы оставить маску сигнала в покое. Если вы по какой-то причине не хотите, чтобы ваш обычный обработчик вызывал вызов во время вызова select(), вы можете использовать эту pselect()функцию.

Редактировать:

Когда доставляется сигнал

Если сигнал включен (т.е. не заблокирован) и процесс запущен, немедленно.

Если сигнал включен, а процесс находится в состоянии прерывистого сна (что означает состояние == S в выводе top / ps), системный вызов прерывается (например, путем возврата EINTR вызывающей стороне) и выполняется обработчик сигнала.

Если сигнал заблокирован, он ожидает доставки, как только он будет разблокирован. Системные вызовы не прерываются заблокированными сигналами.

В вашем примере это означает, что select() ожидает ввода; когда ввод становится доступным, он возвращается, обработчик сигнала включается (во втором вызове sigprocmask) и вызывается обработчик.

Вот как это выглядит в strace:

Process 22393 attached - interrupt to quit
19:31:05.844940 select(1, [0], NULL, NULL, NULL) = 1 (in [0])
19:31:12.131431 rt_sigprocmask(SIG_UNBLOCK, [INT TERM], [INT TERM], 8) = 0
19:31:12.131560 --- SIGINT (Interrupt) @ 0 (0) ---
19:31:12.131730 fstat64(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 1), ...}) = 0
19:31:12.131871 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7ffb000
19:31:12.132027 write(1, "signal..."..., 9) = 9
19:31:12.132148 exit_group(1)           = ?
Process 22393 detached

Как включить сигналы

Чтобы обработчик сигналов был включен постоянно, просто удалите sigprocmask() из кода вызовы to .

Вы явно блокирование SIGINT вокруг на select вызов, поэтому, конечно , это не работает.

Что ты пытаешься сделать?