当前位置:  开发笔记 > 运维 > 正文

我应该如何关闭信号处理程序中的套接字?

如何解决《我应该如何关闭信号处理程序中的套接字?》经验,为你挑选了2个好方法。

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

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



1> MarkR..:

通常情况下,建议不要在信号处理程序中做任何事情; 除了设置标志.

然后当控制返回到主循环时,您可以检查此标志,退出循环,关闭套接字,在对象上运行析构函数等,然后干净地退出.

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



2> derobert..:

好吧,既然你有信号处理程序,我会假设你使用的是Unix版本.如果是这样:

通过文件号向内核标识套接字,该文件号为int.见socket(2).

该int对您的进程有效

该int对于创建它之后分叉的任何进程都有效

如果不是close-on-exec,它对你执行的任何进程都有效.

因此,它在您的信号处理程序中完全有效.如何让信号处理程序知道要使用的编号取决于您编写的语言,这是您未指定的语言.有两种方法几乎适用于任何语言

如果除了close退出之外没有任何清理工作,只需调用exit.或者将信号操作设置为默认值,即退出.内核将关闭套接字.

设置一个标志(通常是某种类型的全局)来告诉你的select/poll循环清理并退出.有利的是,您不必担心程序的各个部分是否可以安全地从信号处理程序调用.

推荐阅读
mobiledu2402851203
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有