一、基础概念
wait()
或者waitpid()
系统调用来获取子进程的退出状态等信息,从而释放子进程的资源(如进程控制块等)。如果父进程没有及时调用这些系统调用,子进程就会变成僵尸进程。僵尸进程虽然已经不再执行任何操作,但它仍然占用一定的系统资源(主要是进程控制块)。SIGCHLD
信号。父进程可以设置一个信号处理函数来捕获这个信号,在信号处理函数中调用wait()
或者waitpid()
来回收子进程资源。二、相关优势
三、应用场景
四、示例代码(使用信号处理避免僵尸进程)
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
void sigchld_handler(int signo) {
pid_t pid;
while ((pid = waitpid(-1, NULL, WNOHANG))>0) {
printf("Child process %d terminated.
", pid);
}
}
int main() {
pid_t pid;
signal(SIGCHLD, sigchld_handler);
pid = fork();
if (pid == 0) {
// 子进程执行的任务
printf("Child process running.
");
sleep(5);
exit(0);
} else if (pid>0) {
// 父进程继续执行其他任务
printf("Parent process running.
");
sleep(10);
} else {
perror("fork");
exit(1);
}
return 0;
}
在这个示例中:
sigchld_handler
,当接收到SIGCHLD
信号时,这个函数会被调用。waitpid
以非阻塞方式(WNOHANG
)回收子进程资源。main
函数中,设置了对SIGCHLD
信号的捕获,然后创建了一个子进程。子进程执行简单的任务后退出,父进程继续执行其他任务,由于设置了信号处理函数,子进程退出时会自动被回收,避免了僵尸进程的产生。领取专属 10元无门槛券
手把手带您无忧上云