open Sys;;

let establish_concurrent_server f port =
  (* Récupération de tous les zombis *)
  let rec wait_for_children signal =
    try
      let pid,_ = waitpid [WNOHANG] (-1) in
      if pid <> 0 then wait_for_children signal
    with Unix_error(ECHILD,_,_) -> () in
  set_signal sigchld (Signal_handle wait_for_children);
  (* Service de chaque connexion *)
  let socket_server = open_server port in
  let rec server () =
    begin
      try
        let socket_connection,client_addr = accept socket_server in
        Printf.eprintf "Connection from %s.\n" (string_of_sockaddr client_addr);
        Pervasives.flush Pervasives.stderr;
        try
          match fork () with
          | 0 -> f socket_connectionexit 0
          | pid -> close socket_connection
        with Unix_error ((EAGAIN|ENOMEM),"fork",_) ->
          close socket_connection;
          prerr_endline "No more process."
      with Unix_error(EINTR,_,_) -> ()
    end;
    server ()
  in server ();;