2011-08-08 18 views
1

私は、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.htmhttp://www.gnu.org/s/hello/manual/libc/Process-Completion.html

答えて

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 
0

ゾンビプロセスからの信号のチュートリアルを参照していますが終了しますが、親プロセスによってまだ待っていないプロセスです。その存在は一時的であるか、親のバグを示すはずです。現在のケースはmongooseです。

+0

プロセスは、同じスクリプトの別のインスタンスの呼び出しに関係なく数時間続きます。だから私のスクリプトではなく、マングースのバグを想定するのは安全ですか? – enthusiasticgeek

関連する問題