Функция pause()
не возвращается, если не вызывается обработчик сигнала (см. Спецификацию и справочную страницу ).
Чтобы вернуть его после того, как ваша программа получит SIGCONT, вы должны установить обработчик для SIGCONT. Попробуйте и посмотрите, используя следующий пример:
#include <signal.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
volatile int caught_signal = 0;
void handler(int sig)
{
caught_signal = sig;
}
int main()
{
signal(SIGCONT, handler);
pause();
printf("Caught signal: %d, %s\n",
caught_signal, strsignal(caught_signal));
return 0;
}
Поведение корректно с GDB 7.0: pause()
полностью игнорирует игнорируемые сигналы (например, SIGCHLD
, возвращает обнаруженные сигналы (SIGCONT
), и при подаче команды continue
сигнал не доставляется.
(gdb) break 17
Breakpoint 1 at 0x80484b3: file pause.c, line 17.
(gdb) continue
Continuing.
^C
Program received signal SIGINT, Interrupt.
0x0012d422 in __kernel_vsyscall ()
(gdb) signal SIGCHLD
Continuing with signal SIGCHLD.
^C
Program received signal SIGINT, Interrupt.
0x0012d422 in __kernel_vsyscall ()
(gdb) signal SIGCONT
Continuing with signal SIGCONT.
Breakpoint 1, main () at pause.c:17
17 printf("Caught signal: %d, %s\n",
(gdb)