在Linux系统中,进程控制是操作系统核心功能之一。在前一篇教程中,我们学习了进程的创建。本教程将深入讲解进程等待,即父进程如何等待子进程结束并获取其状态。
当父进程创建子进程后,子进程可能执行一些任务,父进程需要等待子进程完成以避免僵尸进程,并获取子进程的退出状态。如果不等待,子进程结束后会留下僵尸进程,占用系统资源。
Linux提供了wait和waitpid函数来实现进程等待。
wait函数会阻塞父进程,直到任何一个子进程结束。函数原型如下:
pid_t wait(int *status); 参数status是一个指针,用于存储子进程的退出状态。如果不需要状态,可以传入NULL。
返回值是结束的子进程的PID,如果出错返回-1。
示例代码:
#include #include #include #include int main() { pid_t pid = fork(); if (pid == 0) { // 子进程 printf("子进程执行任务..."); sleep(2); printf("子进程结束。"); } else if (pid > 0) { // 父进程 int status; pid_t child_pid = wait(&status); printf("父进程等待子进程 %d 结束,状态:%d", child_pid, status); } return 0;} waitpid函数更灵活,可以指定等待哪个子进程,以及是否阻塞。函数原型:
pid_t waitpid(pid_t pid, int *status, int options); 参数pid指定子进程PID:
pid > 0,等待该PID的子进程;pid = -1,等待任何子进程,类似wait;pid = 0,等待同一进程组的任何子进程;pid < -1,等待进程组ID为|pid|的任何子进程。参数status同wait。
参数options:可以指定WNOHANG,使函数非阻塞,即如果没有子进程结束,立即返回0。
返回值:如果成功,返回子进程PID;如果使用WNOHANG且没有子进程结束,返回0;出错返回-1。
示例代码:
#include #include #include #include int main() { pid_t pid = fork(); if (pid == 0) { // 子进程 printf("子进程执行..."); sleep(3); printf("子进程完成。"); } else if (pid > 0) { // 父进程 int status; pid_t child_pid; do { child_pid = waitpid(pid, &status, WNOHANG); if (child_pid == 0) { printf("子进程尚未结束,父进程做其他事情..."); sleep(1); } } while (child_pid == 0); if (child_pid == pid) { printf("父进程等待子进程 %d 结束,状态:%d", child_pid, status); } } return 0;} 如果父进程不等待子进程,子进程结束后会成为僵尸进程,占用系统资源。通过wait或waitpid,父进程可以回收子进程资源,避免僵尸进程。这是Linux进程控制中的重要概念。
进程等待是Linux进程控制中的重要环节,掌握wait和waitpid函数对于编写健壮的多进程程序至关重要。通过本教程,您应该了解了如何利用这些函数来管理子进程并避免僵尸进程。
本文由主机测评网于2026-01-30发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://vpshk.cn/20260121761.html