簡體   English   中英

如何防止僵屍子進程?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM