【问题标题】:How to deal with SIGINT?如何处理 SIGINT?
【发布时间】:2011-06-16 07:08:32
【问题描述】:

当我在程序中捕捉到 SIGINT 信号时,如何安全地清理资源? 在信号处理函数中无法调用delete 运算符,因为我不知道如何释放使用new 运算符创建的资源。

有什么想法吗?

【问题讨论】:

  • 附加信息和代码示例:stackoverflow.com/questions/4250013/…
  • 什么意思不能打电话delete
  • 因为 SIGINT 可能在内存管理任务期间异步发生,并且堆可能不一致?当delete 被中断对new 的调用的信号处理程序调用时会发生什么?

标签: c++ sigint


【解决方案1】:

如果您的应用程序正在关闭,请不要担心内存问题。无论如何,一旦您终止,操作系统就会将其全部丢弃。

您需要在信号处理程序中清理的内容将超出您的进程的寿命 - 例如,如果您创建的子进程也需要退出,您应该告诉它这样做。

【讨论】:

  • IIRC,操作系统也会清理任何具有文件 ID(例如文件或套接字)的东西。但是,它不会清理共享内存、信号量和其他 IPC 结构。
  • 对,操作系统会回收内存,但它只是释放我的内存,而不是调用我的析构函数,它将一些信息写入我的日志并关闭日志。
【解决方案2】:

一般来说,您根本不想在信号处理程序中做太多事情,除了设置一个布尔标志,该标志将由程序的其他部分做出反应,通常会导致一些循环失败并允许熟悉的方法在不涉及信号的情况下,您将使用有序关机。使用此标志来协调关闭的原因是某些库函数避免了在异步信号处理期间安全重新​​进入所需的妥协。甚至一些使用线程特定内存的线程安全函数也可能无法处理异步重入。快速搜索在http://book.chinaunix.net/special/ebook/addisonWesley/APUE2/0201433079/ch10lev1sec6.html#ch10lev1sec6 发现了一些关于安全功能的讨论。

【讨论】:

  • 事实上,我尝试按照托尼的描述设置一个布尔标志。但似乎所有线程都在进程中停止,我不知道在哪里检查这个标志让进程退出。没有我的代码的主要条目是一个 linux 库
  • @PDF1001:也许您应该将信号处理留给应用程序 - 库接管它是不寻常的,并且不能很好地扩展(即,如果其他一些,您的库将如何应对库还试图处理 SIGINT 并触发应用程序关闭?)。
猜你喜欢
  • 2016-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-21
  • 1970-01-01
  • 2014-12-10
  • 1970-01-01
  • 2016-07-12
相关资源
最近更新 更多