【问题标题】:sigset_t is useful in this case?sigset_t 在这种情况下有用吗?
【发布时间】:2014-11-03 11:52:52
【问题描述】:

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

我对信号的唯一用途是 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是否有用,并在其中添加我想要处理的所有信号,然后使用像up这样的sigaction,而不是只使用e sigaction?

如果有用,能解释一下原因吗?我有一个测试版程序,它在服务器上使用了一个 sigset,但它不在客户端上。谢谢!

编辑:我刚刚发现服务器还使用 sigprocmask 和 unblock。如果我不想使用它,并且我希望所有信号都被解除阻塞并且他们立即启动他们的处理程序,我不必使用 sigset,对吗?谢谢!

抱歉,我无法发布代码。如果你能帮助我,那很好,如果你不能,无论如何,谢谢!

【问题讨论】:

  • 你的 send() 调用没有意义;它从一个 5 字节数组中发送 1024 个字节。我希望这只是一个例子。
  • @Myria 是的,这只是一个例子,现在是早上 6 点,我还在学习 :( 编辑:无论如何,我不认为这是完全错误的,我的意思是,我发送的字节数比必要的多,但这应该不会破坏任何东西,对吧?
  • 读取数组末尾有未定义的效果。它可能什么都不做,它可能导致核心转储,或者它可能做其他事情。

标签: c sockets signals


【解决方案1】:

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);;这会在信号处理程序生效时阻塞所有信号(可阻塞的)。 SIGKILL 等不可阻挡的信号仍将被传递。


cmets 已发现显示的代码片段存在其他一些问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-25
    • 1970-01-01
    • 2016-05-05
    • 1970-01-01
    • 2012-07-04
    • 2018-05-05
    相关资源
    最近更新 更多