相关疑难解决方法(0)

如何防止SIGPIPE(或正确处理它们)

我有一个小型服务器程序,它接受TCP或本地UNIX套接字上的连接,读取一个简单的命令,并根据命令发送一个回复.问题是客户端有时可能对答案没兴趣并且提前退出,因此写入该套接字将导致SIGPIPE并使我的服务器崩溃.什么是防止崩溃的最佳做法?有没有办法检查线的另一边是否还在读?(select()似乎在这里不起作用,因为它总是说套接字是可写的).或者我应该用处理程序捕获SIGPIPE并忽略它?

c io signals sigpipe broken-pipe

242
推荐指数
8
解决办法
19万
查看次数

在哪里为 SIGPIPE 声明 sig_t 信号

我目前正在使用 kqueue 来处理服务器进程中每个线程的多个客户端,因此我不希望在出现信号 SIGPIPE 时终止线程,我只想从 kqueue 中删除相应的 socked id。所以我的问题是:有没有办法在 Signalhandle 中获取相应的 socketid 并将其解析回进程以将其从事件 kqueue 中删除,或者我是否只需将 SIG_IGN SIGPIPE 并通过返回 -1 来处理删除发送?它会在超时时间后返回-1值还是立即返回发送-1?

最后,如果信号忽略是我的解决方案: id 必须在哪里放置声明

typedef void (*sig_t) (int);
 sig_t
 signal(int sig, sig_t func);
Run Code Online (Sandbox Code Playgroud)

它必须在 main 函数中吗?或者在相应线程的开头?或者只是作为全局元素?

c sockets signals kqueue

5
推荐指数
1
解决办法
2254
查看次数

标签 统计

c ×2

signals ×2

broken-pipe ×1

io ×1

kqueue ×1

sigpipe ×1

sockets ×1