我试图用信号处理程序实现一个简单的服务器/客户端。
我对信号的唯一用途是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);
}
如果服务器(或客户端)收到"关闭",它只会关闭连接。
在这种情况下,使用sigset_t是否有用,并在其中添加我想要处理的所有信号,然后像s一样使用sigaction,而只使用e sigaction?
如果它有用,你能解释一下原因吗?我是一个测试版程序,它在服务器上使用了一个sigset,但它不在客户端上..谢谢!
编辑:我刚刚发现服务器也使用sigprocmask和unblock。如果我不想使用它,并且我希望所有信号都畅通无阻并且他们立即启动他们的处理程序,那么我不必使用sigset,对吧?谢谢!
对不起,但我无法发布代码。如果你能帮助我,这很好,如果你不能,不管怎么说,谢谢!
答案 0 :(得分:0)
为closeSig()
显示的代码无效C.要与sigaction()
和SA_SIGINFO
标志一起使用,函数的类型必须为:
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);
;这会在信号处理程序生效时阻止所有信号(可阻止)。 <{1}}等无法阻止的信号仍会传递。
评论已经确定了显示的代码片段的其他一些问题。