问题标签 [atexit]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
1037 浏览

iphone - 这是最终的 ref 计数 Objective C 单例实现吗?

这是我在仔细研究单身文献后炮制出来的。我忘了什么吗?

0 投票
2 回答
5067 浏览

c - 我可以撤消或删除 atexit 命令吗?

如果我放在atexit( fn );退出堆栈上,它将在程序退出时执行:从main()或通过返回exit()

我可以从堆栈中删除它吗?

你问我为什么要这样做?

我正在尝试使用atexit,setjmp和的简单 try-catch 机制longjmp。如果可以undo-atexit(fn);的话,那就太完美了——即使它只适用于最后一个注册的函数。

编辑:

按照 monoceres 的建议制作我自己的堆栈...

该堆栈目前仅适用于一个异常捕获器。

0 投票
1 回答
13589 浏览

python - Python进程不会调用atexit

我正在尝试atexit在 a中使用Process,但不幸的是它似乎不起作用。这是一些示例代码:

这段代码的输出是:

我希望在调用和W.run.log_terminate()调用时会调用,并且输出会是这样的(添加了重点)!:a.terminate()b.terminate()

为什么这不起作用,当 a终止时是否有更好的方法来记录消息(来自Process上下文) ?Process

感谢您的意见 - 非常感谢。

解决方案

编辑:根据 Alex Martelli 建议的解决方案,以下工作按预期工作:

值得注意的是atexit文档中的以下注释:

注意:当程序被信号杀死,检测到 Python 致命内部错误或调用 os._exit() 时,不会调用通过此模块注册的函数。
0 投票
1 回答
1740 浏览

python - 在 atexit 中引用其他模块

我有一个函数负责在程序结束时杀死一个子进程:

但是,当调用此函数时,我收到一条错误消息:

看起来osandsignal模块在被调用之前被卸载atexit。重新导入它们可以解决问题,但这种行为对我来说似乎很奇怪 - 这些模块是在我注册我的处理程序之前导入的,那么为什么在我自己的退出处理程序运行之前将它们卸载?

0 投票
2 回答
1506 浏览

python - 替代从其他脚本调用时工作的 python atexit 模块

使用atexit.register(function)注册一个函数以在你的 python 脚本退出时调用是一种常见的做法。

问题是我发现了一个以丑陋方式失败的情况:如果您的脚本使用execfile().

在这种情况下,您会发现 Python 在退出时将无法定位您的函数,这是有道理的。

我的问题是如何以不存在此问题的方式保留此功能。

0 投票
3 回答
2750 浏览

python - python 2.6.x theading / 信号 /atexit 在某些版本上失败?

我已经看到了很多与此相关的问题......但我的代码适用于 python 2.6.2 并且无法在 python 2.6.5 上运行。我是否认为整个 atexit“当程序被信号杀死时不会调用通过此模块注册的函数”这件事不应该算在内,因为我正在捕捉信号然后干净地退出?这里发生了什么?这样做的正确方法是什么?

蟒蛇2.6.2:

蟒蛇2.6.5:

2.6.5 上的主线程似乎从不执行 atexit 函数。

0 投票
1 回答
5163 浏览

c++ - dlclose() 不调用全局对象的析构函数

插件1.cpp:

主机.cpp

构建并运行:

为什么 TestStatic::~TestStatic 在 'exit()' 而不是在 'dlclose()' 调用?

0 投票
5 回答
4566 浏览

python - python:闭包和类

我需要注册一个atexit函数以用于一个类(参见Foo下面的示例),不幸的是,我无法通过方法调用直接清理:其他代码,我无法控制,调用Foo.start()Foo.end()但是有时遇到错误不调用Foo.end(),所以我需要自己清理。

在这种情况下,我可以使用一些关于闭包的建议:

  • 闭包能否正常工作,例如在 中do_cleanup,self 的值是否正确绑定?

  • 如何取消注册 atexit() 例程?

  • 有一个更好的方法吗?

编辑:这是 Python 2.6.5

0 投票
1 回答
5420 浏览

c# - 混合模式 C++/CLI 崩溃:atexit 中的堆损坏(静态析构函数注册)

我正在部署一个程序,代码库是 C++/CLI 和 C# 的混合体。C++/CLI 有各种风格:本机、混合 ( /clr) 和安全 ( /clr:safe)。在我的开发环境中,我创建了一个包含所有 C++/CLI 代码的 DLL,并从 C# 代码 (EXE) 中引用它。这种方法完美无缺。

对于我想要发布单个可执行文件的版本(简单地说明“为什么不只将 DLL 和 EXE 分开?”是不可接受的)。

到目前为止,我已经成功地用所有不同的源编译了 EXE。但是,当我运行它时,我会看到“XXXX 已停止工作”对话框,其中包含在线检查、关闭和调试选项。问题详情如下:

如果我调试并将其发送到 Visual Studio,它会报告:

选择 break 会导致它在 ntdll.dll!77d2dc9b() 处停止而没有其他信息。如果我告诉 Visual Studio 继续,程序启动正常并且似乎可以正常工作,可能是因为现在附加了调试器。

你怎么看这个?如何避免这种堆损坏?除此以外,该程序似乎运行良好。

我的精简编译脚本如下(为简洁起见,我省略了错误检查):


更新 1

在用调试符号编译它并再次尝试后,我确实得到了更多信息。调用栈是:

我的代码行“导致”这个(动态初始化程序Bytes::Null)是:

在声明为的标头中:

我还尝试在标头中执行全局 extern,如下所示:

以同样的方式失败了。

似乎 CRTatexit函数是负责任的,由于静态初始化程序而无意中需要它。


使固定

正如 Ben Voigt 指出的那样,使用任何 CRT 函数(包括本机静态初始化程序)都需要正确初始化 CRT(发生在mainCRTStartupWinMainCRTStartup或中_DllMainCRTStartup)。我添加了一个混合 C++/CLI 文件,其中包含 C++mainWinMain

完成此操作后,程序现在更进一步,但仍然存在问题(将在其他地方解决):

  • 当程序仅在 C# 中运行时,它工作正常,只要它只是调用 C++/CLI 方法、获取 C++/CLI 属性和创建托管 C++/CLI 对象
  • C# 添加到 C++/CLI 代码中的事件永远不会触发(即使它们应该触发)
  • 另一个奇怪的错误是发生异常是 InvalidCastException 说不能从 X 转换到 X(其中 X 与 X 相同......)

但是,由于堆损坏已修复(通过初始化 CRT),问题就完成了。

0 投票
2 回答
3501 浏览

c++ - 用 atexit() 注册的函数没有被调用

是否保证在正常程序终止时总是会调用使用 atexit 注册的函数?(我在 FreeBSD 中遇到了一个场景,我在 atexit 注册的函数永远不会被调用,即使程序正常终止也是如此)。