繁体   English   中英

忽略信号的不同方法?

[英]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_DFLSIG_IGNSIG_ERR不是真正的函数。 它们是signal()专门处理的常量。 特别是在 Linux 上, SIG_DFL整数值为1SIG_IGN整数值为0SIG_ERR整数值为-1 ,它们都不是有效的函数指针。

Q2。 不,自定义信号处理程序(即使没有操作)的行为与SIG_IGN略有不同。 如果您调用exec() ,则具有处置SIG_IGN信号将被继承,而所有其他信号将被重置为SIG_DFLSIGCHLD除外,其中 POSIX 未指定应为SIG_IGNSIG_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM