在Linux系统中,僵死进程(Zombie Process)是指已经执行结束的进程,但其父进程还没有调用wait()系统调用来获取子进程的退出状态码,因此子进程的退出信息(包括进程ID、退出状态码等)仍然保存在系统进程表中。这种进程不占用系统资源,但会占用进程表项,如果大量存在,可能导致系统无法创建新的进程。
", WEXITSTATUS(status)); } else { perror("fork"); } return 0; }
2. **使用信号处理**:
父进程可以设置信号处理函数来处理SIGCHLD信号,当子进程结束时,操作系统会发送SIGCHLD信号给父进程,父进程可以在信号处理函数中调用wait()或waitpid()。
```c
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
#include <unistd.h>
void sigchld_handler(int signum) {
int status;
while (waitpid(-1, &status, WNOHANG) > 0);
}
int main() {
signal(SIGCHLD, sigchld_handler);
pid_t pid = fork();
if (pid == 0) {
// 子进程执行的代码
execl("/bin/ls", "ls", NULL);
_exit(0);
} else if (pid > 0) {
// 父进程继续执行其他任务
sleep(10);
} else {
perror("fork");
}
return 0;
}
防止僵死进程的关键在于父进程及时回收子进程的资源。可以通过调用wait()或waitpid()系统调用,设置信号处理函数,或者依赖init系统来自动处理僵死进程。这样可以确保系统资源的有效利用和系统的稳定性。
领取专属 10元无门槛券
手把手带您无忧上云