У меня есть скрипт CGI, работающий на «веб-сервере mongoose», написанный на C ++ (независимо от специфических API mongoose для переносимости в будущем) на Ubuntu 10.04. Всякий раз, когда я вызываю скрипт из веб-браузера (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;
}
Однако, похоже, он не улавливает сигнал, который запускается, когда пользователь закрывает веб-браузер или переходит на другую страницу, так как я не вижу никаких журналов. Мне интересно, является ли это ошибкой в mongoose или в моем скрипте (я не использую процесс или потоки fork () в моем скрипте. Но mongoose действительно использует потоки. Также я не использую какие-либо специфичные для веб-сервера mongoose API-интерфейсы в моем скрипте.) ,
Я имею в виду обучающий сигнал здесь http://orchard.wccnet.org/~chasselb/linux275/ClassNotes/process/sigbasics.htm и
http://www.gnu.org/s/hello/manual/libc/Process-Completion.html