进程?-6ren"> 进程?-我有一个在 Ubuntu 10.04 上用 C++ 编写的“ Mongoose 网络服务器”上运行的 CGI 脚本(为了将来的可移植性独立于 Mongoose 特定的 API)。每当我从网络浏览器 (-6ren">
gpt4 book ai didi

c - 如何在 "mongoose webserver"(Linux) 上处理/杀死 cgi 脚本 (C++) 的 Zombie 或 进程?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:10:28 26 4
gpt4 key购买 nike

我有一个在 Ubuntu 10.04 上用 C++ 编写的“ Mongoose 网络服务器”上运行的 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-Completion.html

最佳答案

他们更新了 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

关于c - 如何在 "mongoose webserver"(Linux) 上处理/杀死 cgi 脚本 (C++) 的 Zombie 或 <defunct> 进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6986543/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com