5

我正在编写一个使用套接字的 API。在 API 中,我为各种项目分配内存。我想确保关闭套接字并释放内存,以防出现 Ctrl-C 等信号。在对此进行研究时,似乎 free() 不在安全函数列表(man 7 信号)中,因此,我无法释放信号处理程序内的内存。我可以关闭套接字就好了。有人对如何释放内存有任何想法吗?提前感谢您的宝贵时间。

4

4 回答 4

6

或者,不要捕捉信号,而是让操作系统处理清理,因为它无论如何都会在进程清理期间执行。您不会释放任何不直接与流程绑定的资源,因此没有特别需要手动释放它们。

于 2012-01-26T17:48:29.733 回答
5

一种技术(也存在其他技术):

  1. 让您的程序运行一个主处理循环。
  2. 让你的主处理循环检查一个标志,看看它是否应该“继续运行”。
  3. 让您的信号处理程序简单地将“继续运行”标志设置为 false,但不要以其他方式终止程序。
  4. 让您的主处理循环在退出之前进行内存清理。

这样做的好处是将分配和取消分配都放在以已知序列调用的代码块中。在处理相互关联的对象网络时,这样做可能是天赐之物,并且两个处理流之间不会出现竞争条件,试图弄乱同一个对象。

于 2012-01-26T17:40:22.680 回答
2

不要在处理程序中释放。相反,向您的程序表明需要释放某些东西。然后,在你的程序中检测到它,这样你就可以从主上下文中解放出来,而不是信号上下文。

于 2012-01-26T17:39:42.090 回答
2

您是在编写库还是应用程序?如果您正在编写库,则无需安装信号处理程序,这将与调用应用程序发生冲突。如果需要,处理此类信号是应用程序的业务,然后对您的库进行适当的清理调用(从信号处理程序上下文之外)。

当然,即使您正在编写应用程序,也没有理由SIGINT关闭套接字和释放内存。处理信号的唯一原因是您不想终止,或者您有未保存的数据或共享状态(如共享内存或文件系统中的内容)需要在终止之前清理。释放内存或关闭纯粹由您自己的进程使用的文件描述符不是您在退出时需要执行的任务。

于 2012-01-26T17:47:50.347 回答