问题标签 [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.
iphone - 这是最终的 ref 计数 Objective C 单例实现吗?
这是我在仔细研究单身文献后炮制出来的。我忘了什么吗?
c - 我可以撤消或删除 atexit 命令吗?
如果我放在atexit( fn );
退出堆栈上,它将在程序退出时执行:从main()
或通过返回exit()
。
我可以从堆栈中删除它吗?
你问我为什么要这样做?
我正在尝试使用atexit
,setjmp
和的简单 try-catch 机制longjmp
。如果可以undo-atexit(fn);
的话,那就太完美了——即使它只适用于最后一个注册的函数。
编辑:
按照 monoceres 的建议制作我自己的堆栈...
该堆栈目前仅适用于一个异常捕获器。
python - Python进程不会调用atexit
我正在尝试atexit
在 a中使用Process
,但不幸的是它似乎不起作用。这是一些示例代码:
这段代码的输出是:
我希望在调用和W.run.log_terminate()
调用时会调用,并且输出会是这样的(添加了重点)!:a.terminate()
b.terminate()
为什么这不起作用,当 a终止时是否有更好的方法来记录消息(来自Process
上下文) ?Process
感谢您的意见 - 非常感谢。
解决方案
编辑:根据 Alex Martelli 建议的解决方案,以下工作按预期工作:
值得注意的是atexit
文档中的以下注释:
注意:当程序被信号杀死,检测到 Python 致命内部错误或调用 os._exit() 时,不会调用通过此模块注册的函数。
python - 在 atexit 中引用其他模块
我有一个函数负责在程序结束时杀死一个子进程:
但是,当调用此函数时,我收到一条错误消息:
看起来os
andsignal
模块在被调用之前被卸载atexit
。重新导入它们可以解决问题,但这种行为对我来说似乎很奇怪 - 这些模块是在我注册我的处理程序之前导入的,那么为什么在我自己的退出处理程序运行之前将它们卸载?
python - 替代从其他脚本调用时工作的 python atexit 模块
使用atexit.register(function)
注册一个函数以在你的 python 脚本退出时调用是一种常见的做法。
问题是我发现了一个以丑陋方式失败的情况:如果您的脚本使用execfile()
.
在这种情况下,您会发现 Python 在退出时将无法定位您的函数,这是有道理的。
我的问题是如何以不存在此问题的方式保留此功能。
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 函数。
c++ - dlclose() 不调用全局对象的析构函数
插件1.cpp:
主机.cpp
构建并运行:
为什么 TestStatic::~TestStatic 在 'exit()' 而不是在 'dlclose()' 调用?
python - python:闭包和类
我需要注册一个atexit
函数以用于一个类(参见Foo
下面的示例),不幸的是,我无法通过方法调用直接清理:其他代码,我无法控制,调用Foo.start()
,Foo.end()
但是有时遇到错误不调用Foo.end()
,所以我需要自己清理。
在这种情况下,我可以使用一些关于闭包的建议:
闭包能否正常工作,例如在 中
do_cleanup
,self 的值是否正确绑定?如何取消注册 atexit() 例程?
有一个更好的方法吗?
编辑:这是 Python 2.6.5
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(发生在mainCRTStartup
、WinMainCRTStartup
或中_DllMainCRTStartup
)。我添加了一个混合 C++/CLI 文件,其中包含 C++main
或WinMain
:
完成此操作后,程序现在更进一步,但仍然存在问题(将在其他地方解决):
- 当程序仅在 C# 中运行时,它工作正常,只要它只是调用 C++/CLI 方法、获取 C++/CLI 属性和创建托管 C++/CLI 对象
- C# 添加到 C++/CLI 代码中的事件永远不会触发(即使它们应该触发)
- 另一个奇怪的错误是发生异常是 InvalidCastException 说不能从 X 转换到 X(其中 X 与 X 相同......)
但是,由于堆损坏已修复(通过初始化 CRT),问题就完成了。
c++ - 用 atexit() 注册的函数没有被调用
是否保证在正常程序终止时总是会调用使用 atexit 注册的函数?(我在 FreeBSD 中遇到了一个场景,我在 atexit 注册的函数永远不会被调用,即使程序正常终止也是如此)。