Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在哪里声明信号管道的信号_C_Sockets_Signals_Kqueue - Fatal编程技术网

C 在哪里声明信号管道的信号

C 在哪里声明信号管道的信号,c,sockets,signals,kqueue,C,Sockets,Signals,Kqueue,我目前正在使用一个kqueue来处理Serverprocess中每个线程的多个客户端 所以我不想在信号SIGPIPE出现时终止线程,我只想从队列中删除相应的socketed id。 所以我的问题是:有没有一种方法可以在信号句柄中获取相应的socketid,并将其解析回进程以将其从事件队列中删除,或者我是否需要jsut来标记SIGPIPE 并通过从send返回-1来处理移除?它会在超时后返回-1值还是立即返回send-1 最后,如果忽略信号是我的解决方案:我必须把 typedef void (*s

我目前正在使用一个kqueue来处理Serverprocess中每个线程的多个客户端 所以我不想在信号SIGPIPE出现时终止线程,我只想从队列中删除相应的socketed id。 所以我的问题是:有没有一种方法可以在信号句柄中获取相应的socketid,并将其解析回进程以将其从事件队列中删除,或者我是否需要jsut来标记SIGPIPE 并通过从send返回-1来处理移除?它会在超时后返回-1值还是立即返回send-1

最后,如果忽略信号是我的解决方案:我必须把

typedef void (*sig_t) (int);
 sig_t
 signal(int sig, sig_t func);
它必须在主功能中吗?
或者在对应线程的开头?或者就像全局元素一样?

我想不出一个简单的方法让信号处理程序知道当前正在处理的套接字,除非每次执行套接字操作时都设置一些全局状态

您可以从main忽略SIGPIPE。您不定义自己的处理程序,而是使用
SIG\u IGN

signal(SIGPIPE, SIG_IGN);
或者,如果您使用的是
sigaction

struct sigaction act;
act.sa_handler = SIG_IGN;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
sigaction(SIGPIPE, &act, NULL); 
或者,您可以在调用send时发出
MSG_NOSIGNAL
标志。这将禁止生成
SIGPIPE
,而是生成一个
EPIPE
错误(如果忽略
SIGPIPE
,会发生这种情况):

ssize\u t sent=send(sock、buf、sizeof(buf)、MSG\u NOSIGNAL);
如果(已发送>0){
/* ... */
}否则{
断言(发送<0);
swtich(errno){
案例EPIPE:
/*…在关闭的套接字上处理发送*/
/*…处理其他错误情况*/
}
}

send()的结果作出反应至少更便于携带,因此对我来说这似乎是更好的方式。无论如何,我很好奇是否有人有答案(+1)。好吧,也许我又把我的问题表达得很糟糕,但我将使用send()的返回,我只是想知道,我必须把信号放在哪里(信号管,信号灯);获取信号被忽略。这并不能提供问题的答案。要评论或要求作者澄清,请在他们的帖子下方留下评论-你可以随时对自己的帖子发表评论,一旦你有足够的信息,你就可以发表评论。@jpw这一点没有很好的解释,这是真的,但它为我的问题提供了答案问题(即使不是一个好问题,也是一个(正确的)说明性的答案。
ssize_t sent = send(sock, buf, sizeof(buf), MSG_NOSIGNAL);
if (sent > 0) {
    /* ... */
} else {
    assert(sent < 0);
    swtich (errno) {
    case EPIPE:
        /* ...handle sending on a closed socket */
    /* ...handle other error cases */
    }
}