Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 如何将OCaml信号转换为POSIX信号或字符串?_Unix_Ocaml_Signals_Posix - Fatal编程技术网

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

Unix 如何将OCaml信号转换为POSIX信号或字符串?,unix,ocaml,signals,posix,Unix,Ocaml,Signals,Posix,我从OCaml程序运行一个子进程并检查其终止状态。如果它正常退出(WEXITED int),我会得到预期的返回代码(0通常表示成功) 但是,如果它被一个信号(WSIGNALED int)终止,我无法获得正确的POSIX信号号。相反,我得到一些(负的)特定于OCaml的信号号 如何将此非标准信号号转换为正确的POSIX信号号,以获得正确的错误报告?或者,如何将此数字转换为字符串 (我知道有很多命名的整数值,比如Sys.sigabrt,但我真的必须自己编写那个大的匹配语句吗?而且,我不明白为什么他们

我从OCaml程序运行一个子进程并检查其终止状态。如果它正常退出(
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