Linux僵尸進程是指已經結束運行但尚未被其父進程回收資源的子進程
產生僵尸進程的原因:
解決僵尸進程的策略:
#include <sys/types.h>
#include <sys/wait.h>
pid_t pid = fork();
if (pid == 0) {
// 子進程
// ... 執行任務 ...
exit(0);
} else if (pid > 0) {
// 父進程
int status;
pid_t child_pid = wait(&status);
if (child_pid == -1) {
// 處理錯誤
} else {
// 子進程已結束,資源已被回收
}
} else {
// 錯誤處理
}
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
void sigchld_handler(int signum) {
int status;
pid_t child_pid;
while ((child_pid = waitpid(-1, &status, WNOHANG)) > 0) {
// 子進程已結束,資源已被回收
}
}
int main() {
struct sigaction sa;
sa.sa_handler = sigchld_handler;
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_RESTART;
sigaction(SIGCHLD, &sa, NULL);
// ... 創建子進程并執行任務 ...
// 父進程繼續執行其他任務
}
pid_t pid = fork();
if (pid == 0) {
// 子進程
setpgid(0, 0); // 設置子進程為新的進程組組長
// ... 執行任務 ...
exit(0);
} else if (pid > 0) {
// 父進程
// ... 執行任務 ...
exit(0);
} else {
// 錯誤處理
}
總之,要避免僵尸進程的產生,關鍵是確保父進程能夠正確處理子進程的退出狀態。在實際編程中,可以根據具體需求選擇合適的策略來管理子進程。