我从一个OCaml程序中运行一个子进程,并检查其终止状态。如果它正常退出 (WEXITED int
),我得到了预期的返回代码(0通常表示成功)。
然而,如果它是由一个信号终止的(WSIGNALED int
), I 没有得到正确的POSIX信号号。. 相反,我得到了一些(负的)OCaml特定信号号。
我如何将这个非标准信号号转换为正确的POSIX信号号,以获得正确的错误报告?或者,我如何将这个数字转换为一个字符串?
(我知道有很多命名的整数值,如 Sys.sigabrt
但我真的要自己写那么大的匹配语句吗?此外,我不明白为什么他们一开始不使用适当的变体类型,因为这些信号号无论如何都是OCaml特有的)。)
在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
模块,并将它们翻译成字符串。