sigset_t在这种情况下有用吗?

时间:2014-10-22 03:57:44

标签: c sockets signals

我试图用信号处理程序实现一个简单的服务器/客户端。

我对信号的唯一用途是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,对吧?谢谢!

对不起,但我无法发布代码。如果你能帮助我,这很好,如果你不能,不管怎么说,谢谢!

1 个答案:

答案 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}}等无法阻止的信号仍会传递。


评论已经确定了显示的代码片段的其他一些问题。