我已经根据http://www.linux-nantes.org/~fmonnier/ocaml/ocaml-wrapping-c.php上的指南编写了一些CZMQ的OCaml绑定,它们似乎运行得很好。例如,这里是zstr_send:
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)); }
我可以在大多数代码中使用这些绑定发送和接收消息。但是,在某种情况下,我想在信号处理程序内部进行发送和接收,直到在其他代码的后台进行消息传递为止。举这个简化的例子:
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) ;;
从顶层开始,这将失败并显示以下输出:
enter handler0end handlerFatal error: exception Sys_blocked_io与上面的OCaml类似的C代码可以正常工作。OCaml在导致此异常的方程式中添加了什么?