caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
* [Caml-list] different behaviour of Unix.fork on FreeBSD and Linux
@ 2003-05-19  9:35 Beck01, Wolfgang
  2003-05-19 10:03 ` Remi Vanicat
  2003-05-19 10:03 ` John Carr
  0 siblings, 2 replies; 3+ messages in thread
From: Beck01, Wolfgang @ 2003-05-19  9:35 UTC (permalink / raw)
  To: caml-list

Hello,

while recompiling an OCaml program developed under FrreeBSD
in Linux, I had some problems. 

What is the output of the following OCaml program?

open Printf
open Unix

let ftst() =
    let pid = fork()
    in
    if pid = 0 then
	printf "son\n"
    else begin
	printf "father\n";
	let _= wait()
	in
	()
    end
    
let aa =
    printf "test\n"

let main() =
printf "main\n";
    ftst()
;;

main()

On FreeBSD (OCaml 3.02), it is what I expected
  test
  main
  father
  son

However, on Linux (OCaml 3.06), it is

  test
  main
  son
  test    <-- why?
  main    <-- why?
  father

It looks as if the fork causes a second program initialization.
Strange that this doesn't result in an endless loop.

Any ideas?


--
Wolfgang Beck
T-Systems Nova GmbH 

-------------------
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


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [Caml-list] different behaviour of Unix.fork on FreeBSD and Linux
  2003-05-19  9:35 [Caml-list] different behaviour of Unix.fork on FreeBSD and Linux Beck01, Wolfgang
@ 2003-05-19 10:03 ` Remi Vanicat
  2003-05-19 10:03 ` John Carr
  1 sibling, 0 replies; 3+ messages in thread
From: Remi Vanicat @ 2003-05-19 10:03 UTC (permalink / raw)
  To: caml-list

"Beck01, Wolfgang" <BeckW@t-systems.com> writes:


[...]


> open Printf
> open Unix
>
> let ftst() =
>     let pid = fork()
>     in
>     if pid = 0 then
> 	printf "son\n"
>     else begin
> 	printf "father\n";
> 	let _= wait()
> 	in
> 	()
>     end
>     
> let aa =
>     printf "test\n"
>
> let main() =
> printf "main\n";
>     ftst()
> ;;

[...]

>
> However, on Linux (OCaml 3.06), it is
>
>   test
>   main
>   son
>   test    <-- why?
>   main    <-- why?
>   father

it is a problem of bufferisation of the output made by printf. If you
flush stdout before forking, there will be no problem.

-- 
Rémi Vanicat
vanicat@labri.u-bordeaux.fr
http://dept-info.labri.u-bordeaux.fr/~vanicat

-------------------
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


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [Caml-list] different behaviour of Unix.fork on FreeBSD and Linux
  2003-05-19  9:35 [Caml-list] different behaviour of Unix.fork on FreeBSD and Linux Beck01, Wolfgang
  2003-05-19 10:03 ` Remi Vanicat
@ 2003-05-19 10:03 ` John Carr
  1 sibling, 0 replies; 3+ messages in thread
From: John Carr @ 2003-05-19 10:03 UTC (permalink / raw)
  To: Beck01, Wolfgang; +Cc: caml-list


fork duplicates the buffers holding output that has not yet been
written to a file descriptor.  If the output buffer is not empty
at the time of fork, output may be duplicated.

If output is unbuffered or line buffered the program will work
as in the BSD case.  Otherwise you need to arrange for buffered
output to be written before fork().

In C one is advised to call fflush(NULL) before fork if the child does
I/O.  If the child calls exec() immediately _exit() should be used
instead of exit() if the exec() fails.  (_exit() terminates the
process without flushing I/O buffers.)

-------------------
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


^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2003-05-19 10:04 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-05-19  9:35 [Caml-list] different behaviour of Unix.fork on FreeBSD and Linux Beck01, Wolfgang
2003-05-19 10:03 ` Remi Vanicat
2003-05-19 10:03 ` John Carr

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).