[英]How can I prevent zombie child processes?
我正在編寫一個服務器,它使用fork()
為客戶端連接生成處理程序。 服務器不需要知道分叉進程會發生什么 - 它們自己工作,當它們完成時,它們應該只是死而不是變成僵屍。 有什么簡單的方法可以實現這一目標?
有幾種方法,但在父進程中使用SA_NOCLDWAIT
sigaction
可能是最簡單的方法:
struct sigaction sigchld_action = {
.sa_handler = SIG_DFL,
.sa_flags = SA_NOCLDWAIT
};
sigaction(SIGCHLD, &sigchld_action, NULL);
使用雙叉。 讓您的孩子立即分叉另一個副本並讓原始子進程退出。
http://thinkiii.blogspot.com/2009/12/double-fork-to-avoid-zombie-process.html
在我看來,這比使用信號更簡單,更容易理解。
void safe_fork()
{
pid_t pid;
if (!pid=fork()) {
if (!fork()) {
/* this is the child that keeps going */
do_something(); /* or exec */
} else {
/* the first child process exits */
exit(0);
}
} else {
/* this is the original process */
/* wait for the first child to exit which it will immediately */
waitpid(pid);
}
}
如何擺脫僵屍進程?
當你殺死一個正常的進程時,你不能用SIGKILL信號殺死僵屍進程,因為僵屍進程無法回復任何信號。 所以養成良好的習慣非常重要。
然后在編程時,如何擺脫僵屍進程的數量? 根據以上描述,子進程將在其死亡時向父進程發送SIGCHLD信號。 默認情況下,系統會忽略此信號,因此最好的方法是在信號處理函數中調用wait(),這樣可以避免僵屍在系統中停留。 了解更多信息: http : //itsprite.com/how-to-deep-understand-the-zombie-process-in-linux/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.