Unix 如何将OCaml信号转换为POSIX信号或字符串?
我从OCaml程序运行一个子进程并检查其终止状态。如果它正常退出(Unix 如何将OCaml信号转换为POSIX信号或字符串?,unix,ocaml,signals,posix,Unix,Ocaml,Signals,Posix,我从OCaml程序运行一个子进程并检查其终止状态。如果它正常退出(WEXITED int),我会得到预期的返回代码(0通常表示成功) 但是,如果它被一个信号(WSIGNALED int)终止,我无法获得正确的POSIX信号号。相反,我得到一些(负的)特定于OCaml的信号号 如何将此非标准信号号转换为正确的POSIX信号号,以获得正确的错误报告?或者,如何将此数字转换为字符串 (我知道有很多命名的整数值,比如Sys.sigabrt,但我真的必须自己编写那个大的匹配语句吗?而且,我不明白为什么他们
WEXITED int
),我会得到预期的返回代码(0通常表示成功)
但是,如果它被一个信号(WSIGNALED int
)终止,我无法获得正确的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)));
}
编译程序并试用:
$ ocamlopt -o m -I $(ocamlopt -where) wrap.c m.ml
$ ./m
converted -6 -> 2
总而言之,编写一些代码,将其与
Sys
模块中定义的不同信号进行比较,并将其转换为字符串可能更好。如果您使用Jane Street的Core replacement standard library,它包含此功能。@Shawn这听起来很有趣。您是否介意创建一个单独的答案并对此进行详细说明?(例如,链接到文档、确切的功能等)fmt库可以报告信号名称-请参阅
$ ocamlopt -o m -I $(ocamlopt -where) wrap.c m.ml
$ ./m
converted -6 -> 2