问题标签 [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 投票
6 回答
330 浏览

c - 在 C 中进行清理的另一种方法?

考虑这个程序:

然而,这是一种幼稚的方法,因为malloc可能会失败并且指针不是free'd。

所以你可以这样做:

但是我认为这很容易出错。考虑必须分配 20 个指针,在最后一个malloc错误情况下,您必须分配free19 个变量,然后return -1.

我也知道atexit,这可以帮助我这样写:

哪个更好,但我不喜欢必须将所有指针声明为全局指针。有没有办法将这两种方法结合起来,基本上:

  1. 具有指针的析构函数,可以直接执行或与atexit.
  2. 具有指向函数的本地指针。
0 投票
1 回答
970 浏览

multithreading - atexit 是否等待其他线程死亡?

用 atexit() 注册的函数是最后执行的函数吗?是否可能此时其他线程仍在运行?

0 投票
1 回答
2374 浏览

python-3.x - 使用 Flask 开发服务器重新加载器处理多个应用程序对象的 atexit

这是另一个烧瓶开发服务器重新加载器问题。有一百万个问题问为什么它会两次加载所有内容,而这不是其中之一。我知道它会加载所有内容两次,我的问题涉及处理这个现实,我还没有找到我认为解决我正在尝试做的事情的答案。

我的问题是,如何在退出时清理所有应用程序对象?

我目前的方法如下所示。在此示例中,我使用 atexit 函数运行我的清理代码。

这段代码的输出如下:

请注意,首次加载时,会创建一个 ID 为 '864 的应用程序对象。在自动重新加载期间,会创建一个 ID 为 '312 的新应用程序对象。然后,当我按下 Ctrl-C(最后一行)时,将调用 atexit 例程,原始的 '864 app 对象是可以使用 app 变量访问的对象,而不是较新的 '312 app 对象。

我希望能够在服务器关闭或 Ctrl-C 时(在本例中为 '864 和 '312)对浮动的所有应用程序对象进行清理。关于如何做到这一点的任何建议?

或者,如果我可以在重新加载后创建的较新的 '312 对象上运行清理,我也可以完成这项工作 - 但是我目前的方法只能让我清理原始应用程序对象。

谢谢。

UPDATE1:我发现了一个链接,建议使用 try/finally 而不是 atexit 挂钩来完成我上面打算做的事情。切换到此会导致与 atexit 完全相同的行为,因此对我的问题没有帮助:

0 投票
1 回答
898 浏览

python - 在 atexit 回调中设置退出代码

有没有办法在atexit模块中注册并在退出时调用的函数中设置退出代码?调用会sys.exit(code)产生错误,并且不会将退出代码设置为所需的值。

的内容atexit_test.py

0 投票
1 回答
161 浏览

python-3.x - Python3 仅在主进程上运行 atexit

我有一个生成多个子进程的程序,如何让程序只在主进程上调用 atexit.register(function) 而不是在子进程上调用?

谢谢

0 投票
0 回答
366 浏览

c - MinGW 交叉编译的应用程序,atexit / mingw_onexit 在 Windows 10 上崩溃

我有一个从 Fedora Linux 为 Windows 交叉编译的 C 应用程序:

该应用程序用于atexit注册拆卸例程:

https://github.com/jdolan/Objectively/blob/master/Sources/Objectively/Class.c#L74

某些Windows 系统上,注册atexit处理程序会导致崩溃:

这个特定的系统是全新安装的 Windows 10。我尝试以管理员身份运行该应用程序,结果相同。

msvcrt我应该提供不同的版本吗?有点难住了这里。

0 投票
1 回答
1156 浏览

c - POSIX 标准对 atexit() 处理程序中的线程堆栈有何规定?操作系统的做法是什么?

当我们的 UNIX/C 程序需要紧急退出时,我们使用 exit (3) 函数并安装 atexit (3) 处理程序以进行紧急清理。这种方法运行良好,直到我们的应用程序被线程化,此时 atexit() 处理程序停止以可预测的方式工作。

我们通过试验了解到一个错误,线程可能已经在 atexit() 处理程序中死亡,并且它们的堆栈被释放。

我没有在使用 atexit() 的标准链接线程消失中找到引用:从 main() 返回后线程不再存在,但它是在调用 atexit() 之前还是之后?Linux、FreeBSD 和 Mac 上的实际做法是什么?

在多线程程序中是否有一个很好的紧急清理模式?

0 投票
3 回答
13170 浏览

python - 当 python 进程被杀死时运行 atexit()

我有一个在后台运行的 python 进程,我希望它仅在脚本终止时生成一些输出。

调用引发KeyboardInterupt异常并正确sys.exit()调用handle_exit(),但如果我kill {PID}要从终端执行它会终止脚本而不调用 handle_exit()。

有没有办法终止在后台运行的进程,并且在终止之前仍然运行它handle_exit()

0 投票
1 回答
175 浏览

c - C extern clock_t 变量在文件中未按预期工作;

所以我有3个文件;main.c , 文件.c 文件.h

在 file.h 我声明了 3 个变量

在file.c中我写了一个函数来保存主运行程序的时间长度;在 file.h 中,我将其称为“void saveLog(void);”

在 main 开头的 main.c 中,我写了 start_t = clock(); 最后写道atexit(savelog) ,我包含了所有库(所有文件中的 time.h 、 stdlib.h 、 stdio.h )

编译时出现错误 apple linker id error

顺便说一句,我的想法是,开始计算时钟和 main 的开始,并简单地在函数中进行数学运算。我的问题是,为什么它不起作用?我还应该如何使用clock_t变量?我尝试使用 int 进行一些测试,并且似乎可以很好地引用。

0 投票
1 回答
566 浏览

python - 在 Spyder IDE 上不调用 Python atexit 函数

我正在开发 Spyder IDE,版本 3.0.0。我的 python 版本是 2.7.12。出于某种原因,atexit 机制在这个特定的 IDE 上不起作用。


代码


结果

当我在 PyCharm 或 Windows cmd 中运行脚本时,它会打印:

当我从 Spyder 运行它时,没有调用 done 函数,也没有打印 2。最终结果是:


有人知道为什么会这样,我该如何解决?

谢谢!