释放信号处理程序内的内存

时间:2012-01-26 17:30:09

标签: c linux signals signal-handling

我正在编写一个使用套接字的API。在API中,我为各种项目分配内存。我想确保关闭套接字并释放内存以防有诸如Ctrl-C之类的信号。在研究这个时,似乎free()不在安全功能列表(man 7信号)上,因此,我无法释放信号处理程序内的内存。我可以关闭套接字就好了。有没有想过如何释放记忆?提前感谢您的时间。

4 个答案:

答案 0 :(得分:6)

或者,不要捕获信号,只是让操作系统处理清理工作,无论如何都要在进程清理过程中进行清理。您没有发布任何与流程无直接关系的资源,因此无需手动释放它们。

答案 1 :(得分:4)

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

  1. 让您的程序运行主处理循环。
  2. 让您的主处理循环检查一个标志,看它是否应该“继续运行”。
  3. 让你的信号处理程序简单地将“keep running”标志设置为false,但不以其他方式终止程序。
  4. 让您的主处理循环在退出之前进行内存清理。
  5. 这有利于将分配和解除分配放在用已知序列调用的代码块中。在处理相互关联的对象的网络时,这样做可能是一个天赐之物,并且在试图弄乱同一个对象的两个处理流程之间不存在竞争条件。

答案 2 :(得分:2)

不要在处理程序中释放。相反,请向您的程序指出需要释放的内容。然后,在程序中检测到,这样就可以摆脱主要的上下文,而不是信号上下文。

答案 3 :(得分:2)

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

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