Во время выполнения 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
, и преобразует их в строки.