Version française
Home     About     Download     Resources     Contact us    
Browse thread
[Caml-list] Client/Server socket communication
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
From: IKEDA Katsumi <ikeda@m...>
Subject: Re: [Caml-list] Client/Server socket communication
Hi,
Thank you for your quick reply.

From: tim@fungible.com (Tim Freeman)
Message-ID: <20020918031351.4EC427F4F@lobus.fungible.com>
> Another workaround is to fork twice, so the original process is the
> parent of a temporary process, and the temporary process is the parent
> of the process you really wanted to create.  The temporary process
> exits immediately and the original parent waits for it immediately.
> This leaves no defunct processes.

I try this solution.
But <defunct> is occurred.
Do I misunderstand your advice?

Modified server.ml is the following.

---------------- server.ml ----------------
(* server.ml *)

let openSock port = 
  let sock = Unix.socket Unix.PF_INET Unix.SOCK_STREAM 0 in
  begin
    Unix.bind sock (Unix.ADDR_INET(Unix.inet_addr_any,port));
    Unix.listen sock 20;
    sock
  end
;;

let waitChild s = 
  print_string "server: waitChild called\n";
  flush stdout ;
  let s =  Unix.waitpid [ Unix.WNOHANG ] 0 in ()
;;

let run_child fd =
  let pid2 = Unix.fork() in
  match pid2 with
    0 ->
      begin
	print_string "run a child process.\n";
	flush stdout;
	let buf = String.create 10 in
	let ret = Unix.read fd buf 0 10 in
	begin
	  print_string "ret = "; print_int ret; print_newline();
	  print_string buf; print_newline();
	  flush stdout;
	  Unix.sleep(5);
	  print_string "exit a child process.\n";
	  flush stdout;
	  exit 0
	end
      end
  | _ ->
      begin
	print_string "exit temporary parent.\n";
	flush stdout;
	exit 0
      end
;;
	

let main() =
  Sys.set_signal Sys.sigchld (Sys.Signal_handle waitChild) ;
  print_string "server started.\n";
  flush stdout;
  let port = 999999 in
  let sock = openSock port in
  while true do
    try
      let (fd,a) = Unix.accept sock in 
      begin
        print_string "server accepted \n"; 
        flush stdout;
        let pid = Unix.fork() in
        match pid with
          0  ->
	    run_child fd
	| _ -> (* parent process *)
	    begin
	      print_string "server parent side\n";
	      flush stdout ;
	    end
      end
    with
      Unix.Unix_error(err, ctx1, ctx2) ->
	if (err = Unix.EINTR) then
	  print_string "Function interrupted by signal\n"
 	else
	  begin
	    print_string "Unix.Unix_error in main\n";
	  end
    | _ -> print_string "Unexpected Exception\n"
  done;
;;

main();;
--------------------------------

thanks.

-- 
IKEDA Katsumi  <ikeda@msi.co.jp>
-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners