在Linux多进程编程中,进程等待是一个至关重要的概念。当父进程创建子进程后,子进程独立运行,但父进程需要知道子进程的结束状态,并及时回收子进程的资源,否则子进程会变成僵尸进程,占用系统资源。本文将详细讲解进程等待的原理、方法及实战代码,帮助小白彻底掌握这一核心技能。
子进程退出时,内核会保留其部分数据(如退出码、资源使用信息等),直到父进程通过wait()或waitpid()函数读取这些信息。如果父进程不等待,子进程的PCB(进程控制块)就无法完全释放,从而形成僵尸进程。大量僵尸进程会耗尽系统进程表项,影响系统稳定性。
wait()函数使父进程阻塞,直到任意一个子进程结束。其原型为:
#include #include pid_t wait(int *status); 参数status是一个整型指针,用于获取子进程的退出状态(可用WIFEXITED等宏解析)。返回值是结束子进程的PID,出错返回-1。
#include #include #include #include int main() { pid_t pid = fork(); if (pid == 0) { // 子进程 printf("子进程运行中,PID=%d", getpid()); sleep(2); exit(3); } else if (pid > 0) { // 父进程 int status; pid_t ret = wait(&status); if (WIFEXITED(status)) { printf("子进程%d正常退出,退出码=%d", ret, WEXITSTATUS(status)); } } return 0;} waitpid()可以指定等待某个子进程,并支持非阻塞模式。原型:
pid_t waitpid(pid_t pid, int *status, int options); WNOHANG,设置为非阻塞模式,若没有子进程退出立即返回0。 int status;pid_t ret = waitpid(-1, &status, WNOHANG);if (ret == 0) { printf("没有子进程退出,继续干别的...");} else if (ret > 0) { // 处理退出子进程} 阻塞等待:调用wait()或waitpid(..., 0)时,如果没有子进程结束,父进程会一直挂起,直到有子进程结束。这种方式简单但效率低。非阻塞等待:通过waitpid(..., WNOHANG)实现,父进程可以轮询子进程状态,同时处理其他任务,适合需要高并发的场景。
进程等待是Linux多进程编程中不可或缺的一环,它通过wait函数和waitpid函数回收子进程资源,避免僵尸进程。掌握这两个函数的使用,特别是非阻塞等待,能让你编写出更健壮的系统程序。希望本文能帮你彻底理解进程等待的核心思想!
本文由主机测评网于2026-02-17发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/20260225490.html