C 程序终止时Linux套接字释放太慢

C 程序终止时Linux套接字释放太慢,c,linux,sockets,C,Linux,Sockets,编辑:tl;医生: 不要用错误的选项打开插座,它不太可能工作 原始问题: 我正在使用一个没有干净关机机制的程序,它只是依靠被杀死来终止它 它打开一个套接字,如下所示: (void) setsockopt(h, SOL_SOCKET, (SO_KEEPALIVE | SO_REUSEADDR), (int *) & optval, sizeof( optval )); 重复使用地址选项似乎确实有效,因为最终在程序死后释放套接字。最终是从几秒钟到一分钟 这是相当乏味的,因为我需要定期重新启

编辑:tl;医生:

不要用错误的选项打开插座,它不太可能工作

原始问题:

我正在使用一个没有干净关机机制的程序,它只是依靠被杀死来终止它

它打开一个套接字,如下所示:

(void) setsockopt(h, SOL_SOCKET, (SO_KEEPALIVE | SO_REUSEADDR), (int *) & optval, sizeof( optval ));
重复使用地址选项似乎确实有效,因为最终在程序死后释放套接字。最终是从几秒钟到一分钟


这是相当乏味的,因为我需要定期重新启动这个程序。使程序正确地终止将是一项非常艰巨的工作,但我想知道是否有更多的本地操作可以让我更早地释放套接字?

套接字选项不是位,因此不能像
SO_KEEPALIVE | SO_REUSEADDR
那样进行设置。为了学究气,
SO_KEEPALIVE | SO_REUSEADDR
生成另一个套接字选项
SO_NO_CHECK


您没有注意到这个错误,因为您没有检查
setsockopt
的返回值。现在您知道了为什么忽略返回值被认为是不好的做法。

是的,正如@Maxim所说。一旦你修复了setsockopt调用并正确设置了sou REUSEADDR,我相信你会看到你想要的行为,而不必在等待状态下等待套接字清除。你可以为调用
shutdown()
SIGINT
信号(例如)的
SIGTERM
close()添加一个信号处理程序
(这会导致它立即被释放)并使用
\u exit()
abort()
终止。我同意这是一个好主意,希望有一天我们能将整个项目修复为正确关闭进程。不幸的是,有一整套基础设施需要更新以支持这一点,因此这不是“仅仅”添加它的问题。实际上,如果您当前没有捕获
SIGTERM
SIGINT
,那么就添加一个在套接字描述符上调用
close()
的信号处理程序,然后再添加
sigaction()
为自己恢复默认处理程序,最后
kill()
重新发送信号,就足够了。被该信号杀死的唯一区别(默认情况下发生的情况)是套接字首先被关闭。如果你愿意,我可以为你展示一个简单的示例程序。(至于你最初的问题,我同意Maxim Yegorushkin的回答,所以这个例子只是一个旁白。)好的,这看起来很简单。我不是一个Linux专家,但是现在我已经查阅了SIGINT和SIGTERM,我可以看出这在不重新设计整个项目的情况下是可行的。谢谢你教育我。