信号处理不适用于 -ansi 或 POSIX define
Signal handling doesn't work with -ansi or with POSIX define
我正在尝试使用 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);
}
请注意,上面的代码包含一个无限循环。
谢谢:)
来自信号 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 上它按预期工作。
看起来你的系统有 Unix/System V 信号机制,它在第一个信号后将信号动作重置为 SIG_DFL。
所以你必须在信号处理程序本身中重新安装处理程序:
static void signal_handler(int nbr)
{
signal(SIGINT, signal_handler);
(void)nbr;
puts("\nHi ! ");
}
我正在尝试使用 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);
}
请注意,上面的代码包含一个无限循环。
谢谢:)
来自信号 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 上它按预期工作。
看起来你的系统有 Unix/System V 信号机制,它在第一个信号后将信号动作重置为 SIG_DFL。 所以你必须在信号处理程序本身中重新安装处理程序:
static void signal_handler(int nbr)
{
signal(SIGINT, signal_handler);
(void)nbr;
puts("\nHi ! ");
}