OS2/emx/syscall/_fork

OS2/emx/syscall/_fork

現行プロセスを複製することによる子プロセスの生成。

emxlib.doc 内にある fork() の項:

子プロセスは以下の属性を親から継承する。

  • 環境(変数)
  • DLL(emx 0.9c 以上で作成されたものに限る)。 使える DLL は 64 個(fix04 では 255 個)以下
  • メモリの内容(データセグメント、ヒープ、スタック、DLL のデータセグメント)
  • シグナル
  • ファイルハンドル
  • カレントディレクトリ
  • umask
  • _uflags() で設定したフラグ
  • ブレークポイント

OS/2 API を直接呼び出して確保したシステムリソースは継承されない。

プロセス中に複数のヒープオブジェクトが分断化された状態で存在する場合、fork は失敗する。

If the process has a non-contiguous heap (that is, multiple heap objects), fork() will fail. Increase the initial heap size to work around this problem. If any DLL used by the program shares the heap with the program and uses the heap in _DLL_InitTerm() by calling sbrk(), malloc(), etc., fork() will fail. In both cases, fork() will return -1 and set errno to ENOMEM.

emxlib.doc 内にある _DLL_InitTerm の説明から

If the DLL shares the heap with the Program (for instance, if both use emxlibcs.dll) and if _DLL_InitTerm() uses the heap (by calling sbrk(), malloc(), etc.), fork() will always fail for that program.

emxdev.doc の最後に非常にせつない情報が…

  • fork() does'nt work correctly in multithread programs.

げふっ。