在Ubuntu系統中,僵尸進程(Zombie Process)通常是由于父進程未能正確處理子進程的結束狀態而導致的。當一個子進程執行完成后,它會向父進程發送一個SIGCHLD
信號,通知父進程它已經結束。如果父進程沒有調用wait()
或waitpid()
來讀取子進程的退出狀態并回收資源,子進程就會成為僵尸進程。
SIGCHLD
信號給父進程。如果父進程沒有調用wait()
或waitpid()
來處理這個信號,子進程就會變成僵尸進程。為了觀察僵尸進程的產生,可以編寫一個簡單的程序,如下所示:
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main(void) {
pid_t pid = fork();
if (pid < 0) {
perror("fork failed.");
exit(1);
} else if (pid > 0) {
printf("This is the parent process. My PID is %d.
", getpid());
for (; pid > 0; pid--) {
sleep(1);
}
} else if (pid == 0) {
printf("This is the child process. My PID is: %d. My PPID is: %d.
", getpid(), getppid());
exit(0);
}
return 0;
}
將上述代碼保存為zomprocdemo.c
,編譯并運行:
gcc zomprocdemo.c -o zomprocdemo
./zomprocdemo
此時,子進程已經退出,但父進程沒有退出也沒有通過wait()
調用處理子進程。使用ps
命令查看進程狀態,可以看到子進程處于僵尸狀態(Z)。
wait()
或waitpid()
:在父進程中使用wait()
或waitpid()
函數來等待子進程的結束,并回收子進程的資源。SIGKILL
或SIGTERM
信號給父進程來終止它。SIGCHLD
信號,當子進程退出時,這個信號處理函數會被調用,然后可以安全地調用wait()
或waitpid()
來清理子進程。通過以上方法,可以有效地避免和處理Ubuntu系統中的僵尸進程,確保系統的穩定性和性能。