Version française
Home     About     Download     Resources     Contact us    
Browse thread
Unix.create_process vs Unix.open_process_out
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
From: Gerd Stolpmann <info@g...>
Subject: Re: [Caml-list] Unix.create_process vs Unix.open_process_out

Am Montag, den 14.04.2008, 08:43 -0400 schrieb James Jones:
> Consider the following two functions:
> 
> let test1 () =
>   let w = Unix.open_process_out "cat" in
>   assert (Unix.close_process_out w = Unix.WEXITED 0)
> 
> let test2 () =
>   let r,w = Unix.pipe () in
>   let pid = Unix.create_process "cat" [| "cat" |] r Unix.stdout
> Unix.stderr in
>   Unix.close w;
>   assert (snd (Unix.waitpid [] pid) = Unix.WEXITED 0)
> 
> 
> Both execute "cat" and then close its stdin immediately. 

Ahem, the second version doesn't. Note that there are 4 involved
descriptors: r and w before forking, and r and w after forking (resp.,
the descriptors in the calling and in the called program). You close
only one of the w's, so the pipe remains open.

> This should cause cat to terminate. In test1 this works as expected
> but in test2, cat keeps running forever. Is this the expected behavior
> of Unix.create_process? 

Yes.

Gerd

> _______________________________________________
> Caml-list mailing list. Subscription management:
> http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list
> Archives: http://caml.inria.fr
> Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
> Bug reports: http://caml.inria.fr/bin/caml-bugs
-- 
------------------------------------------------------------
Gerd Stolpmann * Viktoriastr. 45 * 64293 Darmstadt * Germany 
gerd@gerd-stolpmann.de          http://www.gerd-stolpmann.de
Phone: +49-6151-153855                  Fax: +49-6151-997714
------------------------------------------------------------