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