朱莉娅,处理键盘中断

时间:2013-12-29 23:32:35

标签: sigint julia

标题说明了一切。如何在朱莉娅处理或抓住SIGINT?从我假设的文档中我只想使用InterruptException块捕获try/catch,如下所示

try
    while true
        println("go go go")
    end
catch ex
    println("caught something")
    if isa(ex, InterruptException)
        println("it was an interrupt")
    end
end

但是当我使用^C杀死程序时,我从不输入catch块。

编辑:上面的代码按照julia REPL的预期工作,而不是在脚本中。

2 个答案:

答案 0 :(得分:8)

我看到了与alto相同的行为,即当我的代码作为脚本运行时,SIGINT会终止整个进程,但是当它在REPL中运行时会被捕获为错误。我的版本是最新的,看起来与tholy相似:

julia> versioninfo()
Julia Version 0.3.7
Commit cb9bcae* (2015-03-23 21:36 UTC)
Platform Info:
  System: Linux (x86_64-linux-gnu)
  CPU: Intel(R) Core(TM) i7-3610QM CPU @ 2.30GHz
  WORD_SIZE: 64
  BLAS: libopenblas (DYNAMIC_ARCH NO_AFFINITY Sandybridge)
  LAPACK: libopenblas
  LIBM: libopenlibm
  LLVM: libLLVM-3.3

通过源代码挖掘,我发现Julia's中断行为由jl_exit_on_sigint选项确定的提示,可以通过ccall设置。对于REPL,jl_exit_on_sigint0,但从命令行运行init.c程序文件时,1看起来好像设置为Julia

无论调用环境如何,添加适当的ccall都会使alto的代码有效:

ccall(:jl_exit_on_sigint, Void, (Cint,), 0)

try
    while true
        println("go go go")
    end
catch ex
    println("caught something")
    if isa(ex, InterruptException)
        println("it was an interrupt")
    end
end

这似乎有点像黑客。是否有更优雅的方式来选择环境的中断行为?默认似乎很明智,但也许应该有一个命令行选项来覆盖它。

答案 1 :(得分:0)

适合我。我正在跑步

julia> versioninfo()
Julia Version 0.3.0-prerelease+695
Commit 47915f3* (2013-12-27 05:27 UTC)
DEBUG build
Platform Info:
  System: Linux (x86_64-linux-gnu)
  CPU: Intel(R) Core(TM) i7 CPU       L 640  @ 2.13GHz
  WORD_SIZE: 64
  BLAS: libopenblas (USE64BITINT DYNAMIC_ARCH NO_AFFINITY)
  LAPACK: libopenblas
  LIBM: libopenlibm

但我希望没有必要完全了解这一点(我猜0.2也应该没问题)。