我正在写一个非常简单的服务器,它会一直循环,直到按下Ctrl-C。我想让ctrl-c的信号处理程序关闭打开的套接字并关闭服务器,但我不知道信号处理程序的范围是什么,我不喜欢声明套接字的想法(s)我需要接近全球化。
有人可以提供建议吗?有没有一些标准的方法来做到这一点?
答案 0 :(得分:9)
通常情况下,建议不要在信号处理程序中做任何事情;除了设置标志。
然后,当控制返回到主循环时,您可以检查此标志,退出循环,关闭套接字,在对象上运行析构函数等,然后干净地退出。
信号处理程序几乎可以在任何时候被调用,包括在C或C ++库调用的中间,这可能是一个问题。
答案 1 :(得分:7)
好吧,既然你有信号处理程序,我会假设你使用的是Unix版本。如果是这样的话:
socket(2)
。因此,它在您的信号处理程序中完全有效。如何让信号处理程序知道要使用的编号取决于您编写的语言,这是您未指定的语言。有两种方法可以在几乎任何语言中使用
close
之外没有任何清理工作并退出,只需拨打exit。或者将信号操作设置为默认值,即退出。内核将关闭套接字。