pthread_atfork(3) fork(2) の際に呼び出されるハンドラを登録する

書式

int pthread_atfork(void (*prepare)(void), void (*parent)(void), void (*child)(void));

説明

pthread_atforkfork(2) によって新しいプロセスが生成される際、その直前と直後に呼び出される ハンドラ関数を登録する。 prepare ハンドラは、新しいプロセスが生成される直前に親プロセスから 呼び出される。 parent ハンドラは、 fork(2) がリターンする直前に親プロセスから呼び出される。 child ハンドラは fork(2) が返る直前に子プロセスから呼び出される。

prepare, parent および child の三つのハンドラのうちの一つまたは複数に NULL を与えることができるが、これは対応する時点でいかなるハンドラをも 呼び出す必要がないことを意味する。

pthread_atfork は複数のハンドラの組合せを登録するために複数回 呼び出すことが可能である。 fork(2) の時点で複数の prepare ハンドラは LIFO 順で呼び出される( pthread_atfork で最後に加えられたものが fork の前に最初に呼び出される)。 他方、 parentchild は FIFO 順で呼び出される (最初に加えられたものが最初に呼び出される)。

pthread_atfork の目的を理解するために、 fork(2) は、現在ロック状態にある mutex も含めて、呼び出したスレッドのみの メモリ空間全体を複製することを思い出そう。つまり、他のスレッドは 子プロセスでは実行されていないのである。従って、 fork を呼び出したスレッド以外のスレッドによって mutex がロックされている のならば、その mutex は子プロセスの中で永遠にロックされたままであり、 子プロセスの実行をブロックする可能性がある。 これを避けるためには、 pthread_atfork で次のようなハンドラを登録すれば良いだろう: prepare ハンドラが大域的な mutex を(ロックする際の順序で)ロックし、 parentchild がそれらを(逆の順に)アンロックする。 または、 prepareparentNULL に設定し、 child を大域的な mutex に対して pthread_mutex_init を呼び出す関数に設定しても良いだろう。

返り値

pthread_atfork は成功すれば 0 を返し、エラーがあれば非ゼロのエラーコードを返す。

エラー

ENOMEM
ハンドラを登録するのにメモリが足りない。

著者

Xavier Leroy <[email protected]>