package picos

  1. Overview
  2. Docs

Basic IO facilities based on OCaml standard libraries for Picos.

Modules

module Unix : sig ... end

A transparently asynchronous replacement for a subset of the Unix module that comes with OCaml.

Examples

First we open some modules for convenience:

open Picos_structured.Finally
open Picos_structured
open Picos_stdio

A pair of pipes

Here is a simple example of two fibers communicating through a pair of pipes:

# Picos_fifos.run ~forbid:false @@ fun () ->

  let@ msg_inn, msg_out =
    finally Unix.close_pair @@ fun () ->
    Unix.socketpair PF_UNIX SOCK_STREAM 0 ~cloexec:true
  in
  let@ syn_inn, syn_out =
    finally Unix.close_pair @@ fun () ->
    Unix.socketpair PF_UNIX SOCK_STREAM 0 ~cloexec:true
  in

  Unix.set_nonblock msg_inn;
  Unix.set_nonblock msg_out;
  Unix.set_nonblock syn_inn;
  Unix.set_nonblock syn_out;

  Bundle.join_after begin fun bundle ->
    Bundle.fork bundle begin fun () ->
      let bytes = Bytes.create 100 in
      while true do
        let n = Unix.read msg_inn bytes 0 100 in
        if n > 0 then begin
          Printf.printf "%s\n%!" (Bytes.sub_string bytes 0 n);
          assert (1 = Unix.write_substring syn_out "!" 0 1)
        end
      done
    end;

    let send_string s =
      let n = String.length s in
      assert (n = Unix.write_substring msg_out s 0 n);
      assert (1 = Unix.read syn_inn (Bytes.create 1) 0 1)
    in

    send_string "Hello, world!";
    send_string "POSIX with OCaml";

    Bundle.terminate bundle
  end
Hello, world!
POSIX with OCaml
- : unit = ()
OCaml

Innovation. Community. Security.