C 信号处理不';t使用-ansi或POSIX define
我正在尝试使用signal函数(我知道它已经被弃用了,它的可移植性有很多问题,但我不能使用sigaction) 我还需要使用-ansi和-D_POSIX_C_SOURCE=200112L进行编译 如果我使用这些标志之一编译,信号只工作一次。 如果不使用sigaction,如何使用这些标志获得相同的行为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
#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说什么原因,他都不能使用它。