【问题标题】:Signal handling doesn't work with -ansi or with POSIX define信号处理不适用于 -ansi 或 POSIX 定义
【发布时间】:2015-03-17 13:34:01
【问题描述】:

我正在尝试使用信号功能(我知道它已被弃用并且它的可移植性存在很多问题但我不能使用 sigaction)。

我还需要使用 -ansi 和 -D_POSIX_C_SOURCE=200112L 进行编译

如果我使用这些标志之一进行编译,信号只能工作一次。 请问如何在不使用 sigaction 的情况下使用这些标志获得相同的行为?

    #include        <signal.h>
    #include        <stdio.h>

    static void     signal_handler(int nbr)
    {
      (void)nbr;
      puts("\nHi ! ");
    }

    int              main(void)
    {
      signal(SIGINT, signal_handler);
      puts("Hi ! ");
      while (42);
      return (0);
    }

请注意,上面的代码包含一个无限循环。

谢谢:)

【问题讨论】:

  • 请编辑您的问题,解释为什么您不能使用sigaction;你真的应该,而且我看不出有任何理由不使用它!
  • 我不能因为学校的规定要求我们使用 signal() 系统调用!
  • 顺便说一句,您不能也不应该在信号处理程序中使用puts(因为它不是async-signal-safe-function)。阅读signal(7)

标签: c linux signals ansi-c


【解决方案1】:

看起来您的系统具有 Unix/System V 信号机制,该机制在第一个信号之后将信号操作重置为 SIG_DFL。 所以你必须在信号处理程序本身中重新安装处理程序:

  static void     signal_handler(int nbr)
    {
      signal(SIGINT, signal_handler);
      (void)nbr;
      puts("\nHi ! ");
    }

【讨论】:

  • 没有必要,从 linux signal man 可以看出,使用 ansi 编译会强制执行类似 system-v 的信号行为
  • @olegst 这就是 OP 报告的内容,这就是 OP 观察到信号处理程序只被调用一次的原因?
  • 确实如此,但奇怪的是:在 Linux 上,使用 --ansi 编译的同一程序的行为会有所不同,具体取决于您是否也使用 bsd_source 标志
  • 一点都不奇怪。信号的 BSD 实现不会重置信号处理程序(使用 -D_BSD_SOURCE),而 Unix 和 System V 会重置。显然,使用 sigaction 只是避免了这种混淆(以及其他信号陷阱),但无论出于何种原因 OP 说他不能使用它。
【解决方案2】:

来自signal linux man:

       * On glibc 2 and later, if the _BSD_SOURCE feature test macro is not
         defined, then signal() provides System V semantics.  (The default
         implicit definition of _BSD_SOURCE is not provided if one invokes
         gcc(1) in one of its standard modes (-std=xxx or -ansi) or defines
         various other feature test macros such as _POSIX_SOURCE,
         _XOPEN_SOURCE, or _SVID_SOURCE; see feature_test_macros(7).)

我只是随机尝试并使用 -D_BSD_SOURCE 编译,在 Ubuntu 上它按预期工作。

【讨论】:

  • 谢谢!它真的很好用!当我看到它时,我认为它没有帮助,我不知道 System V 语义!我会调查的:)谢谢!
猜你喜欢
  • 2012-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多