【发布时间】:2014-10-31 04:50:20
【问题描述】:
谁能帮我理解以下三种处理信号的方式有什么区别?我在 C 中的客户端/服务器中运行。
编辑:我知道第一个例子是错误的,现在我想知道哪个更好/可能,第二个还是第三个?我还在网上读到有人在它们之间进行混合,使用“sigemptyset”和“sigaddset”中的“struct sigaction sig”,没有任何 sigprocmask。这比我的两种解决方案都好吗?
处理程序:
void closeSig(){
close(socketAccept);
close(socket);
exit(1);
}
第一个例子:
signal(SIGINT, closeSig);
第二个例子:
sigset_t set;
struct sigaction sig;
sigemptyset(&set);
sigaddset(&set, SIGINT);
sig.sa_sigaction = &closeSig;
sig.sa_flags = SA_SIGINFO;
sig.sa_mask = set;
sigaction(SIGINT, &sig, NULL);
sigprocmask(SIG_UNBLOCK, &set, NULL);
第三个例子:
struct sigaction sig;
sig.sa_sigaction = &closeSig;
sig.sa_flags = SA_SIGINFO;
sigaction(SIGINT, &sig, NULL);
【问题讨论】:
-
提问前你搜索了吗?你看过What is the difference between
sigaction()andsignal()?你缺少什么信息吗?你为什么不提到你看过它? -
@JonathanLeffler 是的,很抱歉这是一个错字。我已经搜索了但我没有找到你的帖子,这对sigaction()和signal()之间的区别非常清楚。但是还有一个案例:使用 sigaction 与 sigset+sig_unblock 或不使用 sigset 的区别? ://
-
您在问题中显示
sigprocmask(),但在评论中提及sigset()及其亲属(sigrelse()、sighold()、sigpause()、sigignore())。还有pthread_sigmask()。通常不应使用sigset()系列——它们被标记为“过时”,新代码不应使用它们。你真正感兴趣的是什么? -
我觉得从信号处理程序调用
exit()不是个好主意。 -
@JonathanLeffler 我在大学学习,为了学习目的,我被要求创建一个服务器/客户端并处理信号,这就是为什么我想了解两者之间的区别第二个例子和第三个例子。就我得到的结果而言,如果我使用第二个示例或第三个示例,它会是一样的吗?
标签: c sockets signals signal-handling