[英]different ways to ignore a signal?
我是 Linux 和信号处理的新手。 signal
函数原型是
sighandler_t signal(int signum, sighandler_t handler);
以下是我的问题:
Q1-如果我想忽略SIGINT
信号,那么我只需要简单地编码为: signal(SIGINT, SIG_IGN);
,我的理解正确吗?
Q2-如果我编码为:
void sigint_handler(int sig)
{
//do thing
}
int main()
{
/* Install the SIGINT handler */
if (signal(SIGINT, sigint_handler) == SIG_ERR)
unix_error("signal error");
pause(); /* Wait for the receipt of a signal */
return 0;
}
由于我自己的sigint_handler
什么都不做,这很像忽略SIGINT
,所以我可以说这种方法与signal(SIGINT, SIG_IGN);
基本相同signal(SIGINT, SIG_IGN);
?
Q3- SIG_IGN
在哪里? 是否在用户进程地址空间的.code
段中为:
如果我的假设是正确的,编译器是否会自动将此处理程序注入已编译的代码中?
Q3。 SIG_DFL
、 SIG_IGN
和SIG_ERR
不是真正的函数。 它们是signal()
专门处理的常量。 特别是在 Linux 上, SIG_DFL
整数值为1
, SIG_IGN
整数值为0
, SIG_ERR
整数值为-1
,它们都不是有效的函数指针。
Q2。 不,自定义信号处理程序(即使没有操作)的行为与SIG_IGN
略有不同。 如果您调用exec()
,则具有处置SIG_IGN
信号将被继承,而所有其他信号将被重置为SIG_DFL
( SIGCHLD
除外,其中 POSIX 未指定应为SIG_IGN
或SIG_DFL
)。
一季度。 是的,但即使在这种情况下无关紧要,通常还是首选使用sigaction()
不是signal()
。
如果我想忽略
SIGINT
信号,那么我只需要简单地编码为:signal(SIGINT, SIG_IGN);
,我的理解正确吗?
是的,但signal
的文档建议使用sigaction
。 signal
的语义因系统而异,而sigaction
的语义更一致。
编译器是否自动将此处理程序注入已编译的代码中?
不。编译器不会为SIG_IGN
创建空处理程序。 它从字面上告诉操作系统忽略进程的信号。 它不是一个函数指针,而是一个特殊处理的值signal
。
由于我自己的
sigint_handler
什么都不做,这很像忽略SIGINT
,所以我可以说这种方法与signal(SIGINT, SIG_IGN);
基本相同signal(SIGINT, SIG_IGN);
?
虽然两者都有效地忽略了信号,但还是存在差异。
EINTR
错误以允许信号处理程序运行。 SIG_IGN
不会发生这种情况。SIG_IGN
将在exec
存活,但处理程序不能。SIG_DFL
,因此您的代码只会忽略此类系统上信号的第一个实例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.