私は、Ubuntu 10.04上で、C++で書かれた "mongoose webserver"上でCGIスクリプトを実行しています(今後の移植性のために、mongoose固有のAPIに依存しません)。私は、Webブラウザ(クローム)からスクリプトを起動するたびに、プロセスが正常に動作しますが、私はps -al
を実行したとき、私は私が親プロセスを殺すために、この場合にsudo kill -9 3567
を使用ゾンビや<defunct>のプロセスを、 "mongoose webserver"(Linux)のcgiスクリプト(C++)の処理には使用しますか?
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>
を参照してください。スクリプトに次のコードがあります。
...
#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 webserver固有のAPIを使用しません。 。
私はUnixの内、ここhttp://orchard.wccnet.org/~chasselb/linux275/ClassNotes/process/sigbasics.htmと http://www.gnu.org/s/hello/manual/libc/Process-Completion.html