mod_fastcgiを使用してWindowsサーバーでApacheを使用すると、Cコードは次のようになります。
void main() {
init();
while (FCGI_Accept() >= 0)
work();
cleanup();
}
サービスが停止すると(つまり、net stop apache2)、プロセスはクリーンアップコードに到達せずに終了します。
ここで何が欠けていますか?
FCGI_Accept
マンページとこの FAQ エントリを読むとFCGI_Accept
、実際には Apache がシャットダウンした場合に -1 を返さないようです。SIGUSR1 と SIGTERM のシグナル ハンドラを設定してみてください。少し前にメーリング リストに投稿された例があります (Windows 固有ではありませんが、試してみる価値があります) 。
途中で終了する唯一の方法は、work() (または FCGI_Accept()...) 内のどこかで「exit()」を呼び出すことです。
編集:
FCGI_Accept() ではないかと思われる場合は、onexit() を使用して、"exit()" から呼び出されるコールバックを設定してみてください。少なくとも、これは「exit()」が時期尚早に呼び出されたことを確認します。