我在 Ubuntu 10.04 上用 C++ 编写的“mongoose webserver”上运行了一个 CGI 脚本(独立于 mongoose 特定的 API 以实现未来的可移植性)。每当我从网络浏览器(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 -完成.html