gpt4 book ai didi

java - 为什么 Java 的 .addShutdownHook 在 BeagleBone Black 上不能用于 Ctrl-C?有解决方法吗?

转载 作者:行者123 更新时间:2023-12-01 12:22:22 26 4
gpt4 key购买 nike

问题

我已经在我的 Ubuntu 开发机器和 BeagleBone Black 上运行了以下 Clojure 代码,并且可以确认它适用于前者,但不适用于后者。

(defn setup-shutdown-hook!                           
[f]
(.addShutdownHook (Runtime/getRuntime) (Thread. f)))

(setup-shutdown-hook!
(fn []
(println "I am no more")))

(defn -main []
(doseq [i (range)]
(Thread/sleep 1000)
(println "Staying alive")))

在 BBB 上,关闭 Hook 确实在“自然”关闭的情况下正常工作,但在 Ctrl-C 上则不然。在 Ubuntu 机器上,它似乎总是有效。

对于这种不同的行为有什么解释吗? Java 版本?系统级别差异?是否有解决方法可以获得所需的行为?

系统详细信息

Ubuntu:

java version "1.7.0_65"
OpenJDK Runtime Environment (IcedTea 2.5.2) (7u65-2.5.2-3~14.04)
OpenJDK 64-Bit Server VM (build 24.65-b04, mixed mode)

Beaglebone(运行 Angstrom;通过 SSH 连接):

> java -version
java version "1.7.0_60"
Java(TM) SE Runtime Environment (build 1.7.0_60-b19)
Java HotSpot(TM) Client VM (build 24.60-b09, mixed mode)
> uname -a
Linux beaglebone 3.8.13 #1 SMP Wed Sep 4 09:09:32 CEST 2013 armv7l GNU/Linux

P.S. 对于熟悉 Java 但不熟悉 Clojure 的人来说,上面的 Clojure 代码只是通过其互操作 Hook 到 Java 方法。希望您可以测试一下

最佳答案

天哪...这里没有什么神秘的。我很懒,做了一点作弊,在我的 Ubuntu 机器上运行了 lein exec而不是lein run (就像我在 BBB 上所做的那样)._。显然,事情似乎以这种方式表现不同......

更多关于如何获得所需行为的问题,lein trampoline run -m <ns>就可以了。问题似乎是因为使用 lein run为了在嵌套 JVM 中有效地运行您的应用程序,leiningen 进程捕获 Ctrl-C 而不是您的应用程序代码。使用lein trampoline分离应用程序代码 JVM,以便它捕获 Ctrl-C,并根据需要运行关闭代码。

感谢this post感谢您向我展示了光明,Stack Overflow 提供了精彩的“相关”问题。

关于java - 为什么 Java 的 .addShutdownHook 在 BeagleBone Black 上不能用于 Ctrl-C?有解决方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26582629/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com