在Linux多进程编程中,进程等待是避免僵尸进程、实现父子进程同步的核心技术。本文将通过通俗易懂的例子,带你彻底掌握 wait() 和 waitpid() 的用法。
当子进程退出时,如果父进程没有调用进程等待,子进程就会变成僵尸进程(Zombie Process),占用内核进程表项。此外,父进程往往需要知道子进程的运行结果(退出码或信号),这就需要通过阻塞等待或非阻塞方式收集子进程状态。
#include pid_t wait(int *status); 功能:阻塞当前进程,直到任意一个子进程结束。返回值:成功返回退出的子进程PID,失败返回-1。参数status:输出子进程的退出状态(可用宏解析)。
示例:
pid_t pid = fork();if (pid == 0) {// 子进程exit(42);} else {int status;pid_t ret = wait(&status);if (WIFEXITED(status)) {printf("子进程%d正常退出,退出码:%d", ret, WEXITSTATUS(status));}} pid_t waitpid(pid_t pid, int *status, int options); 参数pid:指定等待的子进程(-1表示任意子进程,>0表示特定PID)。options:常用WNOHANG(非阻塞等待)和WUNTRACED。返回值:返回退出的子进程PID;如果设置了WNOHANG且没有子进程退出,返回0;出错返回-1。
非阻塞等待是waitpid的核心优势,父进程可以在等待期间执行其他任务:
while (1) {pid_t ret = waitpid(-1, &status, WNOHANG);if (ret > 0) {printf("子进程%d已回收", ret);break;} else if (ret == 0) {// 没有子进程退出,做其他事printf("父进程干点别的...");sleep(1);} else {perror("waitpid");break;}} 无论使用哪个函数,都能有效防止僵尸进程的产生。记住:每一个fork出来的子进程,都应该被父进程或init进程(孤儿进程被收养)进行进程等待。
尝试编写一个程序:父进程创建3个子进程,分别执行不同任务,然后使用waitpid配合WNOHANG循环回收,并打印每个子进程的退出状态。通过这个练习,你会深刻理解进程等待和waitpid的灵活之处。
本文关键词:进程等待、waitpid、僵尸进程、阻塞等待 — 掌握这些,你已经迈入Linux进程控制的大门!
本文由主机测评网于2026-04-14发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/20260436812.html