1

OS X では、fork の man ページに次のように書かれています。

子プロセスでできることには制限があります。完全に安全にするには、exec 関数の 1 つが呼び出されるまで、非同期シグナルの安全な操作のみを実行するように制限する必要があります。フレームワークまたはライブラリ内のグローバル データ シンボルを含むすべての API は、安全または async-signal 安全であることが明示的に文書化されていない限り、fork() の後は安全でないと想定する必要があります。子プロセスでこれらのフレームワークを使用する必要がある場合は、exec する必要があります。この状況では、自分自身を実行するのが合理的です。

マニュアルページのフッターに基づいて、これはおそらく長い間そこにありました:

第 4 回バークレー配布 1993 年 6 月 4 日 第 4 回バークレー配布

chdir(2) は fork() と exec() の間で安全に呼び出せると思っていましたが、そのマニュアル ページには非同期呼び出しに対して安全であるとは書かれていません。実際、それは安全ではありませんか?もしそうなら、fork() の前にディレクトリを変更することが本当に期待されていますか? 私には不合理に思えます。

setenv(3) についても同様です。malloc() を呼び出すことを考えると、おそらく安全ではないと思います。しかし、環境を渡すことができる execvp に相当するものはありません。具体的には、execvp は PATH を検索します。私が見つけた中で最も近いのは、環境引数を取る execve() であり、PATH を検索しません。

4

1 に答える 1

1

引用しているテキストの最初のブロック(「制限があります...」)は、Mac OS X専用に追加されました。これは、Appleのライブラリとフレームワーク(AppKit、Carbon、Foundationなど)のほとんどがの後に正しく動作しませんfork()

私の知る限り、を含むすべての標準Cライブラリ関数は、のchdir()後に安全に使用できますfork()

于 2011-12-30T05:49:50.047 に答える