Voir la fonction de même nom dans les transparents du cours.
      
open Sys;;
open Unix;;
let unwind_protect f x g y =
  try let v = f x in g yv with z -> g yraise z

let mon_system arg =
  let old_mask = sigprocmask SIG_BLOCK [ sigchld ] in
  let old_int = signal sigint Signal_ignore in
  let old_quit = signal sigquit Signal_ignore in
  let reset() =
    ignore (signal sigint old_int);
    ignore (signal sigquit old_quit);
    ignore (sigprocmask SIG_SETMASK old_maskin
  let system_call () =
    match fork() with
    | 0 ->
        reset();
        handle_unix_error (execv "/bin/sh") [| "/bin/sh""-c"arg |];
        assert false
    | k ->
        let rec wait() =
          try snd (waitpid [] k)
          with Unix_error (EINTR__) -> wait() in
        wait() in
  unwind_protect system_call() reset()