37441


Unix モジュールの fork 関数を呼ぶと、 fork 前のトップレベルの式が再度実行されてしまいます。 fork 前のコードを fork
後に実行されないようにしたいのですが、どう修正すればよいのでしょうか。

コード:

[code]

    let () =
      Printf.printf "hello, world!\n";
      ignore @@ Unix.fork ()
    
[/code]

実行結果 (ネイティブコードにコンパイルしての実行です):

[code]

    hello, world!
    hello, world!
    
[/code]

実行環境:

  * Mac OS X 10.2.5
  * OCaml 4.04.2


CC BY-SA 3.0
2017-08-23T12:36:38.570
37439
2017-08-23T13:47:09.290
25013
question
ocaml
Unix.fork を呼ぶと fork 前のトップレベルの式が再度実行されてしまう


`Printf.printf` のバッファリングの問題だと思います。`%!` を使って flush してあげます。

[code]

    let () =
      Printf.printf "hello, world!\n%!";
      match Unix.fork () with
      | 0 -> ()
      | _ -> ignore @@ Unix.wait ()
    
[/code]

* * *

補足: トップレベルの式が2回実行されているわけではなさそうということは、入出力以外の副作用を使ってみると推測できます。たとえば参照を使ってみました。

[code]

    let r = ref 0
    let () =
      r := !r + 1;
      Printf.printf "all: %d\n%!" !r;
      match Unix.fork () with
      | 0 -> Printf.printf "child: %d\n%!" !r
      | _ -> Printf.printf "parent: %d\n%!" !r;
             ignore @@ Unix.wait ()
    
[/code]

[code]

    (* 実行結果 *)
    all: 1
    parent: 1
    child: 1
    
[/code]

参考: caml-list に同様の問題が投稿されていたのを見つけました: ["different behaviour of Unix.fork on
FreeBSD and Linux"](https://sympa.inria.fr/sympa/arc/caml-
list/2003-05/msg00162.html)


CC BY-SA 3.0
2017-08-23T13:12:03.797
37441
2017-08-23T13:47:09.290
2017-08-23T13:47:09.290
19110
19110
37439
answer