6

标题说明了一切。我该如何处理或抓住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.

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

4

2 回答 2

9

我看到与 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. jl_exit_on_sigint0用于 REPL,但它看起来好像在从命令行运行程序文件时init.c将其设置为。1Julia

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

这似乎有点骇人听闻。有没有更优雅的方式来选择环境的中断行为?默认值似乎很合理,但也许应该有一个命令行选项来覆盖它。

于 2015-03-26T03:04:38.050 回答
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 也应该没问题)。

于 2013-12-31T11:30:20.430 回答