在fork()/execve()過程中,假設子進程結束時父進程仍存在,而父進程fork()之前既沒安裝SIGCHLD信號處理函數調用waitpid()等待子進程結束,又沒有顯式忽略該信號,子進程則成爲殭屍進程,無法正常結束,
此時即使是root身份kill
-9也不能殺死殭屍進程。補救辦法是殺死殭屍進程的父進程(殭屍進程的父進程必然存在),殭屍進程成爲"孤兒進程",過繼給1號進程init,init始終會負責清理殭屍進程。
產生殭屍進程:
int main(void)
{
pid_t pid;
if((pid = fork()) < 0)
{
printf("fork error");
}else if(pid == 0)
{
exit(0);
}
system("ps|grep defunct|grep -v grep");
exit(0);
}
{
pid_t pid;
if((pid = fork()) < 0)
{
printf("fork error");
}else if(pid == 0)
{
exit(0);
}
system("ps|grep defunct|grep -v grep");
exit(0);
}