C++ 如何处理SIGINT?
当我在程序中捕捉到SIGINT信号时,如何安全地清理资源? 在信号处理函数中,不可能调用C++ 如何处理SIGINT?,c++,sigint,C++,Sigint,当我在程序中捕捉到SIGINT信号时,如何安全地清理资源? 在信号处理函数中,不可能调用delete操作符,因为我不知道如何释放使用new操作符创建的资源 有什么想法吗?如果应用程序正在关闭,不要担心内存问题。无论如何,一旦你终止,操作系统将把它全部扔掉 您需要在信号处理程序中清理的内容将比您的流程更为持久——例如,如果您创建的子流程也需要退出,您应该告诉它退出。通常,您根本不想在信号处理程序中做太多工作,只想设置一个布尔标志,该标志将由程序的其他部分响应,通常会导致一些循环失败,并允许在不涉及
delete
操作符,因为我不知道如何释放使用new
操作符创建的资源
有什么想法吗?如果应用程序正在关闭,不要担心内存问题。无论如何,一旦你终止,操作系统将把它全部扔掉
您需要在信号处理程序中清理的内容将比您的流程更为持久——例如,如果您创建的子流程也需要退出,您应该告诉它退出。通常,您根本不想在信号处理程序中做太多工作,只想设置一个布尔标志,该标志将由程序的其他部分响应,通常会导致一些循环失败,并允许在不涉及信号的情况下使用熟悉的方法有序关闭。使用此标志来协调关闭的原因是,某些库函数避免了在异步信号处理期间安全重新输入所需的妥协。甚至一些使用线程特定内存的线程安全函数也可能无法处理异步重入。通过快速搜索,可以在以下位置找到一些关于安全函数的讨论。其他信息和一个代码示例:调用
delete
,这是什么意思?因为在内存管理任务期间,SIGINT可能异步发生,堆可能不一致?当信号处理程序中断对new
的调用而调用delete
时会发生什么情况?IIRC,操作系统也会清理任何具有文件ID的文件(例如文件或套接字)。但是,它不会清理共享内存、信号量和其他IPC结构。没错,操作系统会回收内存,但它只是释放我的内存,不调用我的析构函数,它将一些信息写入我的日志并关闭日志。事实上,我尝试设置Tony描述的布尔标志。但似乎所有线程都在进程中停止,我不知道在哪里检查该标志以让进程退出。我的代码没有主条目是linuxlibrary@PDF1001:也许你应该离开信号机对应用程序的处理—库接管应用程序是不寻常的,而且扩展性不好(即,如果其他库也尝试处理SIGINT并触发应用程序关闭,那么您的库的处理能力如何?)。