我正在编写一个非常简单的服务器,它会永远循环,直到按下 Ctrl-C。我想让 ctrl-c 的信号处理程序关闭打开的套接字并关闭服务器,但我不知道信号处理程序的范围是什么,而且我不喜欢声明套接字的想法(s) 我需要关闭才能成为全球性的。

有人可以提供建议吗?有一些标准方法可以做到这一点吗?

有帮助吗?

解决方案

好吧,既然你有信号处理程序,我就假设你使用的是 Unix 变体。如果是这样:

  • 内核通过文件号来标识套接字,该文件号是一个 int。看 socket(2).
  • 该 int 对您的进程有效
  • 该 int 对于创建它后分叉的任何进程都有效
  • 如果不是 close-on-exec,则它对您执行的任何进程都有效。

因此,它在您的信号处理程序中完全有效。如何让信号处理程序知道要使用哪个数字取决于您编写的语言(您没有指定)。有两种方法几乎适用于任何语言

  • 如果您没有任何清理工作要做,除了 close 然后退出,只需调用 exit 即可。或者将信号动作设置为默认,即退出。内核将关闭套接字。
  • 设置一个标志(通常是某种全局标志)来告诉您的选择/轮询循环清理并退出。优点是您不必担心程序的各个部分是否可以安全地从信号处理程序调用。

其他提示

通常情况下,这是最好不要做任何多的信号处理函数;除了设置一个标志。

然后,当控制返回到主循环,你可以检查这个标志,退出循环,关闭套接字,你的对象等运行析构函数,并退出干净。

信号处理程序可以被调用在几乎任何时间,包括在C或C的中间++库调用,这可能是一个问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top