C 信号处理不';t使用-ansi或POSIX define

C 信号处理不';t使用-ansi或POSIX define,c,linux,signals,ansi-c,C,Linux,Signals,Ansi C,我正在尝试使用signal函数(我知道它已经被弃用了,它的可移植性有很多问题,但我不能使用sigaction) 我还需要使用-ansi和-D_POSIX_C_SOURCE=200112L进行编译 如果我使用这些标志之一编译,信号只工作一次。 如果不使用sigaction,如何使用这些标志获得相同的行为 #include <signal.h> #include <stdio.h> static void sign

我正在尝试使用signal函数(我知道它已经被弃用了,它的可移植性有很多问题,但我不能使用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);
    }
#包括
#包括
静态无效信号处理器(int nbr)
{
(无效)丁腈橡胶;
放置(“\nHi!”);
}
内部主(空)
{
信号(SIGINT,信号处理器);
放(“嗨!”);
而(42),;
返回(0);
}
请注意,上面的代码包含一个无限循环

谢谢:)

来自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上它可以正常工作。

来自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上它可以正常工作。

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

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

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

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

请编辑您的问题,解释为什么您不能使用
sigaction
;你真的应该,我看不出有什么理由不使用它!因为学校的规定要求我们使用signal()syscall,所以我不能使用!顺便说一句,您不能也不应该在信号处理器内使用
puts
(因为它不是异步信号安全函数)。阅读请编辑您的问题,解释为什么您不能使用
sigaction
;你真的应该,我看不出有什么理由不使用它!因为学校的规定要求我们使用signal()syscall,所以我不能使用!顺便说一句,您不能也不应该在信号处理器内使用
puts
(因为它不是异步信号安全函数)。阅读谢谢!它真的很好用!当我看到它时,我不认为它会有帮助,我不知道SystemV语义!我会调查的:)谢谢!非常感谢。它真的很好用!当我看到它时,我不认为它会有帮助,我不知道SystemV语义!我会调查的:)谢谢!没有必要,从LinuxSignalMan可以看出,使用ansi编译会强制执行信号系统-v-likebehavior@olegst这就是OP报告的,这就是OP观察到信号处理器只被调用一次的原因?是的,但奇怪的是:在Linux上,使用--ansi编译的同一个程序的行为也不同,这取决于您是否使用bsd_源代码标志。这一点也不奇怪。信号的BSD实现不会重置信号处理程序(使用
-D\u BSD\u SOURCE
),而Unix和System V会重置。显然,使用
sigaction
可以简单地避免这种混淆(以及信号的其他陷阱),但不管OP说什么原因,他都不能使用它。没有必要,从LinuxSignalMan可以看出,使用ansi进行编译会强制执行与SignalSystem-v类似的命令behavior@olegst这就是OP报告的,这就是OP观察到信号处理器只被调用一次的原因?是的,但奇怪的是:在Linux上,使用--ansi编译的同一个程序的行为也不同,这取决于您是否使用bsd_源代码标志。这一点也不奇怪。信号的BSD实现不会重置信号处理程序(使用
-D\u BSD\u SOURCE
),而Unix和System V会重置。显然,使用
sigaction
可以简单地避免这种混淆(以及信号的其他陷阱),但不管OP说什么原因,他都不能使用它。