c - 信号处理不适用于 -ansi 或 POSIX define

标签 c linux signals ansi-c

我正在尝试使用 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);
    }

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

谢谢:)

最佳答案

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

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

关于c - 信号处理不适用于 -ansi 或 POSIX define,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29100466/

相关文章:

c - 所有 POSIX/SUS 信号都是 #define 是给定的还是假设的?

c - atmel代码错误?

linux - epoll 对引用目录的文件描述符做了什么?

linux - 我希望linux终端中的命令提示符在打印到终端后出现在新行中

c - sigtimedwait() 在超时前返回 EAGAIN

c++ - std::signal 和 std::raise 线程安全吗?

c - 分段故障处理

c - C 中的回溯练习图形颜色

c - 不友好的数字C

在C中将64位unsigned int来回转换为char缓冲区