gpt4 book ai didi

c - sigset_t 在这种情况下有用吗?

转载 作者:行者123 更新时间:2023-11-30 17:27:08 25 4
gpt4 key购买 nike

我正在尝试实现一个带有信号处理程序的简单服务器/客户端。

我对信号的唯一用途是 sigaction(SIG...,&sig,NULL),其中:

sig.sa_sigaction = &closeSig;
sig.sa_flags = SA_SIGINFO;


void closeSig{
send(ds_sock,"close",1024,0);
close(ds_sock);
exit(1);
}

如果服务器(或客户端)收到“close”,它只会关闭连接。

在这种情况下,使用 sigset_t 并在其中添加我想要处理的所有信号,然后像 up 一样使用 sigaction 是否有用,而不是仅使用 e sigaction?

如果有用的话,能解释一下原因吗?我有一个测试版程序,它在服务器上使用签名集,但在客户端上没有。谢谢!

编辑:我刚刚发现服务器也使用 sigprocmask 和 unblock。如果我不想使用它,并且希望所有信号都被解锁并且它们立即启动其处理程序,那么我不必使用 sigset,对吧?谢谢!

抱歉,我无法发布代码。如果你能帮助我,那就太好了,如果你不能,也谢谢你!

最佳答案

显示的代码为 closeSig()无效 C. 可与 sigaction() 一起使用和 SA_SIGINFO flag,函数的类型需要是:

void closeSig(int signum, siginfo_t *info, void *context) { … }

第三个参数是 void * ,但可以转换为 ucontext_t * (参见 sigaction() )。

当您调用sigaction()时,您应该确保sig.sa_mask设置为已知值,可能通过使用 sigemptyset(&sig.sa_mask);清除所有位。这意味着当调用信号处理程序时,其他信号仍然可以中断信号处理程序。如果您不想让这种情况发生,请使用 sigfillset(&sig.sa_mask);反而;当信号处理程序生效时,这会阻止所有信号(可阻止)。不可阻挡的信号,如 SIGKILL仍将交付。

<小时/>

评论指出了所显示的代码片段的一些其他问题。

关于c - sigset_t 在这种情况下有用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26500097/

25 4 0