我不確定為什么我們需要在父行程中呼叫 wait() 來處理僵尸行程,而雙叉應該處理它?如果僅 wait() 已經可以完成這項作業,為什么我們需要雙叉?
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
int main()
{
pid_t pid;
// fork first time
pid = fork();
if (pid == 0)
{
// double fork
pid = fork();
if (pid == 0)
{
printf("Grandchild pid : %d\n Child"
" pid : %d\n",
getpid(), getppid());
}
else
{
exit(0);
}
}
else
{
wait(NULL);
sleep(10);
}
}
uj5u.com熱心網友回復:
我不確定為什么我們需要在父行程中呼叫 wait() 來處理僵尸行程,而雙叉應該處理它?如果僅 wait() 已經可以完成這項作業,為什么我們需要雙叉?
您誤解了雙重fork成語的目的和用法。
背景
除了 pid 1 之外的每個行程在終止時都會變成僵尸。僵尸一直存在于行程表中,直到它通過wait-family 函式之一被收集。如果行程的父行程還活著,那么那是必須wait收集它的行程。否則,責任將轉移到行程 1。作為行程 1 運行的程式的可行選擇將非常有效地處理這些問題,因此您幾乎永遠不會看到正在等待行程 1 收集它們的僵尸。
加倍fork_
雙倍的意義fork在于原始行程A創建一個行程,該行程將由行程 1 負責清理,盡管A繼續運行。如果你愿意的話,火災并忘記它的情況。這是通過ing立即成為所需行程Cfork的子B來完成的。然后行程B終止以將C的責任轉移給行程 1(而不是行程A)。fork
這并不能減輕行程Await對行程B的責任。但是A可以wait立即執行該操作并且知道它不會被延遲很長時間,而不是阻塞直到C終止,或者必須定期檢查C的完成情況,或者無限期地讓C成為僵尸,這將是如果A fork ed C直接的替代方案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/487152.html
標籤:C
