나는 http://www.linux-nantes.org/~fmonnier/ocaml/ocaml-wrapping-c.php에있는 가이드를 기반으로 CZMQ에 대한 OCaml 바인딩을 작성했습니다. 이것은 꽤 잘 작동하는 것 같습니다. 예를 들어 여기 zstr_send입니다 :신호 처리기에서 OCaml-wrapped ZeroMQ 코드 호출하기
CAMLprim value
caml_zstr_send(value socket_val, value string_val)
{
CAMLparam2 (socket_val, string_val);
void *sock = CAML_CZMQ_zsocket_val(socket_val);
char *string = String_val(string_val);
int rc = zstr_send(sock, string);
CAMLreturn (Val_int(rc));
}
I 보내고 잘 내 코드의 대부분이 바인딩을 사용하여 메시지를받을 수 있습니다. 그러나 나는 신호 처리기 내부에서 송수신을하고 다른 코드의 배경에서 메시지 전달을 마칠 때 시나리오를 사용합니다. 이 간단한 예를 보자 최상위에서
open ZMQ
exception SocketBindFailure
let bg_ctx = zctx_new();;
let pub_sock = zsocket_new bg_ctx ZMQ_PUB;;
let handler _ =
print_endline "enter handler";
print_endline (string_of_int (zstr_send pub_sock "hello"));
print_endline "end handler";
;;
let() =
(try (
(* bind pub socket *)
let rc = zsocket_bind pub_sock "tcp://*:5556" in
if (rc < 0) then (raise SocketBindFailure);
Sys.set_signal
Sys.sigalrm
(Sys.Signal_handle handler);
ignore
(Unix.setitimer
Unix.ITIMER_REAL
{ Unix.it_interval = 0.01 ; Unix.it_value = 0.01 });
(* do some work *)
)
with
| SocketBindFailure -> raise SocketBindFailure)
;;
을이 출력 실패 다음 OCaml의 유사
enter handler
0
end handler
Fatal error: exception Sys_blocked_io
C 코드는 위의 잘 작동합니다. OCaml이이 예외의 원인이되는 방정식에 무엇을 추가합니까?
일반적으로 신호 처리기 내에서 루틴을 호출하는 것은 코드를 감사 할 때 빨간색 플래그입니다.그 이유는 다양하지만 그 주안점은 루틴이 비동기 안전하다는 것을 100 % 확신해야한다는 것입니다. [자세한 내용은 여기를 참조하십시오] –
I (보안) 왜 C 나 OCaml 이건간에 처리기 내에서 IO를 시도하여 이미 위험한 상황에 처했다는 것을 제외하면 예외가 발생한 이유를 말할 수 없습니다. 위의 링크는 신호 처리기 호출을 안전하게 로깅 할 수있는 몇 가지 방법을 제공합니다. –
정보를 제공해 주셔서 감사합니다, Dave. 나는 다른 접근법을 택할 것이다. – user1494672