0

我正在尝试使用信号功能(我知道它已被弃用,并且它的可移植性存在很多问题,但我不能使用 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);
    }

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

谢谢 :)

4

2 回答 2

3

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

  static void     signal_handler(int nbr)
    {
      signal(SIGINT, signal_handler);
      (void)nbr;
      puts("\nHi ! ");
    }
于 2015-03-17T13:47:55.473 回答
1

来自信号 linux 人:

       * 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 上它按预期工作。

于 2015-03-17T13:44:00.527 回答