COBRT096 fork() の無効な使用

COBOL 機能を呼び出したプロセス、またはスレッドが複数あるプロセスで、オペレーティング システムのfork() API を呼び出してから、子プロセスで COBOL 機能を呼び出しました。

プロセスで COBOL 機能を使用した際に、子プロセスが API のfork() セットのいずれかを安全に呼び出した場合にのみ、問題なくexec() を呼び出せます。子プロセスで問題が発生した場合、_exit()が呼び出され、exit()は呼び出されません。

実行時に ***InsertTag***CALL***InsertTag*** を実行すると、アセンブラー モジュールはロードされ、指定した COBOL モジュールのエントリ ポイントにリンクします。fork() API を呼び出す際に、オペレーティング システムは子プロセスでスレッドを 1 つだけ作成します。fork()の使用時に親プロセスで複数のスレッドを実行した場合、スレッド同期オブジェクト (ミューテックスなど) が別のスレッドでロックされている可能性があります。これにより、子プロセスがそれらのスレッド同期オブジェクトを使用した場合に、子プロセスでデッドロックが発生する場合があります。

子プロセスが COBOL 機能を呼び出せるのは、次のすべての条件を満たしている場合のみです。
  • fork() API を呼び出す際に、親プロセスが使用しているスレッドは 1 つだけである。
  • fork()の前後いずれかで、親プロセスが COBOL 機能を呼び出していない。
  • 子プロセスがfork()を呼び出す。