gpt4 book ai didi

c - sigaction - 为什么我们不必重置处理程序?

转载 作者:行者123 更新时间:2023-12-03 22:56:29 25 4
gpt4 key购买 nike

如果我们使用 sigaction 来定义一个信号处理程序,那为什么我们不需要重置处理程序呢?如果我们使用 signal(sig_no,handler_func)那么我们必须重置它。为什么是这样?

#include <unistd.h>
#include <stdio.h>
#include <signal.h>

void func(int sig)
{
printf("caught signal:%d\n",sig);
// Not needed to reset handler. Why?
}

int main()
{
struct sigaction sa;

sa.sa_handler=(void*)func;
sigaction(SIGRTMIN,&sa,NULL);
kill(0,SIGRTMIN);
kill(0,SIGRTMIN);
kill(0,SIGRTMIN);
}
Output:
[root@dhcppc0 signals]# ./a.out
caught signal:34
caught signal:34
caught signal:34 (3 times signal caught by same handler without resetting handler)

最佳答案

真正的原因可以追溯到几十年前。原版signal()没有重新武装处理程序。它也没有重新启动中断的系统调用。 BSD 家伙决定拥有一个更“可靠”的 signal() ,所以他们改变了语义。

由于 System V 和 BSD 的行为如此不同,POSIX 委员会决定引入一个新的系统调用,sigaction() , 带有参数来修改其行为。所以整个原因sigaction()存在是使用在 Unix 变体中表现相同的代码来获得信号。

(请注意,即使使用相同的 libc,signal() 的行为也会发生变化,例如,glibc 默认使用 BSD 行为,定义 _XOPEN_SOURCE 时使用 SYSV 行为)。

关于c - sigaction - 为什么我们不必重置处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5290540/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com