Ubuntu 10.04 の C++ で記述された「mongoose Web サーバー」で実行されている CGI スクリプトがあります (将来の移植性のための mongoose 固有の API とは無関係です)。Web ブラウザー (Chrome) からスクリプトを呼び出すたびに、プロセスは正常に動作しますが、実行するps -al
と表示されます
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 3567 8877 0 80 0 - 23309 hrtime pts/0 00:00:00 mongoose
4 Z 0 3585 3567 7 80 0 - 0 exit pts/0 00:00:00 test <defunct>
sudo kill -9 3567
この場合、親プロセスを強制終了するために使用します。スクリプトに次のコードがあります。
...
#include <sys/wait.h>
...
//==========================================================================
// Define the function to be called when ctrl-c (SIGINT) signal is sent to process
static void signal_callback_handler(int signum)
{
point_of_inspection( __FILE__, __func__, __LINE__, ENABLE_LOG); // Entered the routine
// Cleanup and close up stuff here
while(1)
{
if (signum == SIGTERM)
{
error_log_report("caught signal - premature exit",CAUGHT_SIGNAL_ERROR,ENABLE_LOG);
break;
}
}
clean_exit();
// Terminate program
exit(signum);
}
//======================= Zombies or <defunct> handler ========================
// Signal handler to process terminated children
static void mysig(int nsig)
{
int nStatus, nPid;
while(1)
{
if (nsig == SIGCHLD)
{
nPid = waitpid(-1, &nStatus, WNOHANG);
if(nPid<0)
{
error_log_report("waitpid (nPid<0)",CAUGHT_SIGNAL_ERROR,ENABLE_LOG);
break;
}
if(nPid==0)
{
error_log_report("Caught Signal - Zombies <defunct> (nPid==0)",CAUGHT_SIGNAL_ERROR,ENABLE_LOG);
break;
}
}
}
clean_exit();
exit(nsig);
}
メイン関数では
int main()
{
//some initialization variables
...
// Register signal and signal handler
signal(SIGTERM, signal_callback_handler);
// To clean up terminated children
signal(SIGCHLD, mysig);
...
return 0;
}
ただし、ログが表示されないため、ユーザーが Web ブラウザーを閉じたり、別のページに移動したときにトリガーされる信号をキャッチしていないようです。これが mongoose のバグなのか、自分のスクリプトのバグなのか疑問に思っています (スクリプトでは fork() プロセスやスレッドを使用していません。しかし、mongoose はスレッドを使用しています。また、スクリプトでは mongoose Web サーバー固有の API を使用していません。) .
ここからシグナルチュートリアルを参照していますhttp://orchard.wccnet.org/~chasselb/linux275/ClassNotes/process/sigbasics.htm および http://www.gnu.org/s/hello/manual/libc/Process -Completion.html