信号发生时是否暂停程序
优质
小牛编辑
150浏览
2023-12-01
#include <stdio.h>
#include <signal.h>
void handler(int sig);
void handler(int sig)
{
signal(sig, handler);
printf("Receive signal: %d\n", sig);
}
int main(void) {
signal(SIGHUP, handler);
while (1)
{
sleep(1);
}
return 0;
}
技巧
用gdb调试程序时,可以用“handle signal stop/nostop
”命令设置当信号发生时,是否暂停程序的执行,以上面程序为例:
(gdb) i signals
Signal Stop Print Pass to program Description
SIGHUP Yes Yes Yes Hangup
......
(gdb) r
Starting program: /data1/nan/test
[Thread debugging using libthread_db enabled]
[New Thread 1 (LWP 1)]
Program received signal SIGHUP, Hangup.
[Switching to Thread 1 (LWP 1)]
0xfeeeae55 in ___nanosleep () from /lib/libc.so.1
(gdb) c
Continuing.
Receive signal: 1
可以看到,默认情况下,发生SIGHUP
信号时,gdb会暂停程序的执行,并打印收到信号的信息。此时需要执行continue
命令继续程序的执行。
接下来用“handle SIGHUP nostop
”命令设置当SIGHUP
信号发生时,gdb不暂停程序,执行如下:
(gdb) handle SIGHUP nostop
Signal Stop Print Pass to program Description
SIGHUP No Yes Yes Hangup
(gdb) c
Continuing.
Program received signal SIGHUP, Hangup.
Receive signal: 1
可以看到,程序收到SIGHUP
信号发生时,没有暂停,而是继续执行。
如果想恢复之前的行为,用“handle SIGHUP stop
”命令即可。需要注意的是,设置stop
的同时,默认也会设置print
(关于print
,请参见 信号发生时是否打印信号信息)。
参见 gdb手册.