From mboxrd@z Thu Jan 1 00:00:00 1970 Received: (from majordomo@localhost) by pauillac.inria.fr (8.7.6/8.7.3) id GAA15710; Wed, 18 Sep 2002 06:04:06 +0200 (MET DST) X-Authentication-Warning: pauillac.inria.fr: majordomo set sender to owner-caml-list@pauillac.inria.fr using -f Received: from nez-perce.inria.fr (nez-perce.inria.fr [192.93.2.78]) by pauillac.inria.fr (8.7.6/8.7.3) with ESMTP id GAA15606 for ; Wed, 18 Sep 2002 06:04:05 +0200 (MET DST) Received: from grover.msi.co.jp ([192.51.53.141]) by nez-perce.inria.fr (8.11.1/8.11.1) with ESMTP id g8I443905075 for ; Wed, 18 Sep 2002 06:04:03 +0200 (MET DST) Received: from localhost [127.0.0.1] (ikeda) by grover.msi.co.jp with esmtp (Exim 3.12 #1 (Debian)) id 17rW4I-0006a8-00; Wed, 18 Sep 2002 13:04:02 +0900 To: caml-list@inria.fr Subject: Re: [Caml-list] Client/Server socket communication In-Reply-To: <20020918031351.4EC427F4F@lobus.fungible.com> References: <20020918115148K.ikeda@msi.co.jp> <20020918031351.4EC427F4F@lobus.fungible.com> X-Mailer: Mew version 1.94.2 on Emacs 20.7 / Mule 4.0 (HANANOEN) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-Id: <20020918130400I.ikeda@msi.co.jp> Date: Wed, 18 Sep 2002 13:04:00 +0900 From: IKEDA Katsumi X-Dispatcher: imput version 990905(IM130) Sender: owner-caml-list@pauillac.inria.fr Precedence: bulk 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 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 ------------------- 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