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_connection; exit 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 ();; |