我想知道如果下面的代碼可以創建殭屍:這個C代碼可以創建殭屍進程嗎?
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(){
int i=1;
pid_t p;
p = fork();
i++;
if(p!=0){
waitpid(p, NULL, 0);
}
printf("%d\n",i);
return 0;
}
所以,父進程調用子進程,如果孩子尚未退出後者立即返回waitpid函數。所以,迄今爲止沒有殭屍出現。但是,如果孩子在
return 0;命令之前退出,那麼這將是一個殭屍呢?我實際上對此感到困惑。 waitpid是程序終止前的最後一行代碼嗎?任何幫助,將不勝感激。謝謝!
看起來不錯,但您可能會有誤解。如果孩子已經死亡,'waitpid'會立即返回;否則會阻塞,直到孩子死亡。除非你在waitpid中使用WNOHANG,在這種情況下它不會阻塞,但這在這裏沒有問題。 – Duck
糾正我,如果我錯了,但我認爲第三個參數(零)相當於WHOHANG。無論如何,我們假設它是WHOHANG。那麼殭屍會被創造出來嗎?最後,如果waitpid是返回0之前的最後一個命令;確保不會創造殭屍?再次感謝! – mgus
沒有WNOHANG絕對不等於0.零是默認值,如果等於0,則按位或WNOHANG是沒有意義的。如果孩子在非阻塞的「waitpid」之後死亡並且父親先退出,那麼你會有殭屍。但通常你會在一個循環中使用一個非阻塞的'waitpid',並可能與接收SIGCHLD一起使用。 Waitpid本身可以在代碼中的任何地方,只要它在需要時處理你的孩子。 – Duck