- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
当我们的 UNIX/C 程序需要紧急退出时,我们使用 exit (3) 函数并安装 atexit (3) 处理程序以进行紧急清理。在我们的应用程序被线程化之前,这种方法一直运行良好,此时 atexit() 处理程序停止正常工作。
我们通过试验了解到一个错误,即线程可能已经死在 atexit() 处理程序中,并且它们的堆栈已被释放。
我在标准链接线程消失与atexit()中找不到引号:从main()返回后线程不再存在,但它是在调用atexit()之前还是之后?在 Linux、FreeBSD 和 Mac 上的实际做法是什么?
在多线程程序中有没有好的紧急清理模式?
最佳答案
Posix 标准
Posix 似乎没有定义 atexit
处理程序是在线程被 exit
终止之前还是之后被调用。
进程“正常”终止有两种(或三种)方式。
所有线程终止。当最后一个线程通过返回或调用 pthread_exit
退出时,atexit
处理程序将运行。在这种情况下,没有其他线程。 (这取决于平台。如果主线程不是通过 exit
终止,某些平台可能会终止其他线程,而其他平台则不会)。
一个线程调用exit
。在这种情况下,将运行 atexit
处理程序并终止所有线程。 Posix 没有指定顺序。
main
返回。这或多或少等同于在 main
的最后一行调用 exit()
,因此可以像上面那样处理。
操作系统实践
在 Linux 中,文档 https://linux.die.net/man/2/exit表示线程由 _exit
调用 exit_group
终止,并且 _exit
在 atexit
处理程序之后调用。因此,在 Linux 中调用 exit
时,任何 atexit
处理程序都会在线程终止之前运行。请注意,它们在调用 exit
的线程上运行,而不是在调用 atexit
的线程上运行。
如果您愿意,在 Windows 上的行为是相同的。
紧急清理模式。
最好的模式是:永远不要处于需要紧急清理的状态。
kill -9
或停电。 中止
中恢复,所以您可以使用中止
作为您的紧急导出。如果您不能那样做,或者如果您有想要做的“最好的”清理,atexit
处理程序应该没问题提供您首先优雅地停止进程中的所有线程,以防止在进行清理时进入不一致状态。
关于c - POSIX 标准对 atexit() 处理程序中的线程堆栈有何规定?什么是操作系统实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39655868/
我正在尝试在 Python 中运行一个简单的多进程应用程序。主线程生成 1 到 N 个进程并等待它们全部完成处理。每个进程都运行一个无限循环,因此它们可能会永远运行而不会受到用户的干扰,因此我放入了一
用atexit()注册的函数是最后执行的函数吗?有没有可能此时其他线程还在运行? 最佳答案 Are the functions registered with atexit() the last fu
我可以将常规函数指针传递给atexit(): void f1(void) { printf("f1\n"); } int main() { void (*fun_ptr)(void)
我可以将常规函数指针传递给atexit(): void f1(void) { printf("f1\n"); } int main() { void (*fun_ptr)(void)
是否可以注销退出处理函数??? void exit_handler_1() { printf("in first exit handler\n"); } int main() { if
我知道什么时候函数的地址传递给atexit函数, 该函数被执行。 #include int atexit(void (*func) void)); 但是,使用atexit函数的目的是什么? 词义本身
当我运行 python 脚本时,我可以退出解释器,并且 atexit 将执行我注册的所有函数。 现在,我正在使用 Airflow ,并希望触发 atexit 任务 on_kill() (即,当我清除或
在我的程序中,我使用了一个静态变量(没有其他办法),问题是它需要在退出时被释放。 如何在不必将此变量声明为全局变量的情况下实现这一点? 我在想atexit 函数,但它似乎不能带参数。有什么技巧可以传递
我有一个 C 程序在 Linux 上意外退出,我很难找出原因(没有核心转储,请参阅 XIO: fatal IO error 11)。我在程序的开头放置了一个 atexit() 并且当崩溃发生时确实调用
我想在需要时推送一系列清理功能。我使用 atexit 为一个没有任何参数的清理函数执行此操作,但我不确定如何将这种方法扩展到多个清理函数。我对 boost::bind 不是很熟悉,但我认为这是个好主意
在一个共享库中,函数 func1() 有 atexit(terminate_global) 而这个共享库没有 'attribute ((constructor))' 和 'attribute ((析构
我有两个 python 文件: a.py: import subprocess, time, os, signal myprocess = subprocess.Popen("b.py", shell
我正在用 C++ 编写调试器,退出时我需要它来清除在调试对象中设置的所有断点。 我制作了一个名为 BREAKPOINT_INFO 的 struct,其中包含清除每个断点所需的信息。进程句柄(hProc
有几个教程解释了 atexit() 函数的用法,例如: http://linux.die.net/man/3/atexit 例子在一个简单易懂的main函数中给出。但是,我在我的程序中创建了一个共享库
如果我将 atexit( fn ); 放在退出堆栈上,它将在程序退出时执行:从 main() 返回或通过 exit ()。 我可以将它从堆栈中移除吗? 你问我为什么要这样做? 我正在使用 atexit
在图书馆等大型项目中使用 atexit 是否存在固有的危险? 如果是这样,atexit 背后的技术本质是什么可能导致大型项目出现问题? 最佳答案 我避免在库中使用 atexit 的主要原因是它的任何使
我们遇到了一个问题,即第 3 方库使用 atexit() 注册了一些函数。有什么方法可以知道注册了多少(或哪些)功能? 我检查了here但它说不。 我尝试使用 sysconf 获取 ATEXIT_MA
有什么方法可以在 atexit 模块中注册并在退出时调用的函数中设置退出代码吗?调用 sys.exit(code) 会产生错误,并且不会将退出代码设置为所需的值。 d:\>python atexit_
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 7 年前。 Improv
我的代码工作得很好,但是当我退出 simpleshell 时,我遇到了段错误。 atexit(final) 的决赛仍然被调用并且正常工作。我认为问题出在 atexit() 上,因为当从代码中删除 at
我是一名优秀的程序员,十分优秀!