Как преобразовать сигнал OCaml в сигнал POSIX или строку? - PullRequest
1 голос
/ 02 мая 2020

Я запускаю подпроцесс из программы OCaml и проверяю его состояние завершения. Если он завершился нормально (WEXITED int), я получил ожидаемый код возврата (0 обычно указывает на успех).

Однако, если он был прерван сигналом (WSIGNALED int), я don ' получить правильный номер сигнала POSIX . Вместо этого я получаю некоторый (отрицательный) специфичный для OCaml c номер сигнала.

Как преобразовать этот нестандартный номер сигнала в правильный номер сигнала POSIX для правильных отчетов об ошибках? В качестве альтернативы, как мне преобразовать это число в строку?

(я знаю, что существует множество именованных целочисленных значений, таких как Sys.sigabrt, но действительно ли мне нужно написать это большое выражение соответствия? Я не понимаю, почему они вообще не использовали правильный тип варианта, учитывая, что эти номера сигналов в любом случае являются OCaml c.

1 Ответ

1 голос
/ 02 мая 2020

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

...