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