Browse thread
[Caml-list] Client/Server socket communication
-
IKEDA Katsumi
-
tim@f...
- IKEDA Katsumi
- Alessandro Baretta
-
tim@f...
[
Home
]
[ Index:
by date
|
by threads
]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
[ 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