1

我在 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.htmhttp://www.gnu.org/s/hello/manual/libc/Process -完成.html

4

2 回答 2

1

他们更新了mongoose.c文件中的代码来收割僵尸。以下是部分代码。

#if !defined(_WIN32) && !defined(__SYMBIAN32__)
  // Ignore SIGPIPE signal, so if browser cancels the request, it
  // won't kill the whole process.
  (void) signal(SIGPIPE, SIG_IGN);
  // Also ignoring SIGCHLD to let the OS to reap zombies properly.
  (void) signal(SIGCHLD, SIG_IGN);
#endif // !_WIN32
于 2011-09-08T16:11:14.110 回答
0

Unix 中的僵尸进程是被父进程终止但尚未等待的进程。在本例中,它们的存在应该是暂时的,或者表示父级中的错误mongoose

于 2011-08-08T18:30:28.087 回答