如何将OCaml信号转换为POSIX信号或字符串?

问题描述 投票:0回答:1

我从一个OCaml程序中运行一个子进程,并检查其终止状态。如果它正常退出 (WEXITED int),我得到了预期的返回代码(0通常表示成功)。

然而,如果它是由一个信号终止的(WSIGNALED int), I 没有得到正确的POSIX信号号。. 相反,我得到了一些(负的)OCaml特定信号号。

我如何将这个非标准信号号转换为正确的POSIX信号号,以获得正确的错误报告?或者,我如何将这个数字转换为一个字符串?

(我知道有很多命名的整数值,如 Sys.sigabrt但我真的要自己写那么大的匹配语句吗?此外,我不明白为什么他们一开始不使用适当的变体类型,因为这些信号号无论如何都是OCaml特有的)。)

unix ocaml signals posix
1个回答
1
投票

在OCaml运行时有一个函数可以完成这种转换(自然)。调用这个函数并不合乎礼节,但如果你不介意写的代码会在未来的OCaml版本中崩溃(以及其他可能的坏结果),这里有对我有用的代码。

OCaml运行时函数的包装器。

$ cat wrap.c
#include <caml/mlvalues.h>

extern int caml_convert_signal_number(int);

value oc_sig_to_host_sig(value ocsignum)
{
    /* Convert a signal number from OCaml to host system.
     */
    return Val_int(caml_convert_signal_number(Int_val(ocsignum)));
}

一个测试程序

$ cat m.ml
external convert : int -> int = "oc_sig_to_host_sig"

let main () =
    Printf.printf "converted %d -> %d\n" Sys.sigint (convert Sys.sigint)

let () = main ()

编译程序,然后试一试。

$ ocamlopt -o m -I $(ocamlopt -where) wrap.c m.ml
$ ./m
converted -6 -> 2

总而言之,最好是写一些代码来比较一下 Sys 模块,并将它们翻译成字符串。

© www.soinside.com 2019 - 2024. All rights reserved.