首页 理论教育 零点起步:等待进程结束

零点起步:等待进程结束

时间:2023-10-31 理论教育 版权反馈
【摘要】:对这两个函数的声明如下:wait()函数使父进程暂停执行,直到有信号到来或子进程结束为止。头文件sys/wait.h中定义了解读进程退出状态的宏。表9-3 检查wait()和waitpid()所返回的终止状态的宏waitpid()也用来等待子进程的结束,但它用于等待某个特定进程结束。参数pid指明要等待的子进程的PID。如果子进程尚未退出,它将返回0;如果子进程已经结束,则返回child_pid。失败的原因包括没有该子进程和参数不合法等。

零点起步:等待进程结束

当子进程先于父进程退出时,如果父进程没有调用wait()和waitpid()函数,子进程就会进入僵死状态。如果父进程调用了wait()或waitpid()函数,就不会使子进程变为僵死进程。对这两个函数的声明如下:

978-7-111-33316-6-Chapter09-42.jpg

wait()函数使父进程暂停执行,直到有信号到来或子进程结束为止。该函数的返回值是终止运行的子进程的PID。子进程的结束状态值会由参数status返回,即从子进程的main()函数返回的值或子进程中exit()函数的参数。如果不需要结束状态值,则参数status可以设置为NULL。头文件sys/wait.h中定义了解读进程退出状态的宏。表9-3所示为检查wait()和waitpid()所返回的终止状态的宏。

表9-3 检查wait()和waitpid()所返回的终止状态的宏

978-7-111-33316-6-Chapter09-43.jpg

waitpid()也用来等待子进程的结束,但它用于等待某个特定进程结束。参数pid指明要等待的子进程的PID。waitpid()函数参数pid不同取值的对应状态见表9-4。参数status的含义与wait()函数中的status相同。options参数允许用户改变waitpid的行为,若将该参数赋值为WNOHANG,则使父进程不被挂起而立即返回,并执行其后的代码;如果该参数赋值为WUNTRACED,当子进程进入暂停执行情况时立即返回。

表9-4 waitpid()函数参数pid不同取值的对应状态

978-7-111-33316-6-Chapter09-44.jpg

如果想让父进程周期性地检查某个特定的子进程是否已经退出,可以按如下方式调用waitpid()。

978-7-111-33316-6-Chapter09-45.jpg

如果子进程尚未退出,它将返回0;如果子进程已经结束,则返回child_pid。调用失败时返回-1。失败的原因包括没有该子进程和参数不合法等。wait()等待第一个终止的子进程,而waitpid()则可以指定等待特定的子进程。waitpid()提供了一个wait()的非阻塞。有时希望取得一个子进程的状态,但不想使父进程阻塞,waitpid()提供了选项WNOHANG,它可使调用者不阻塞。如果一个没有任何子进程的进程调用wait()函数,就会立即出错返回。(www.xing528.com)

【例9-5】进程等待。

本例主要使用wait()函数来实现进程等待。

设计步骤

1)在Vim中创建一个新工程文件,命名为“example9_6.c”。

2)在“example9_6.c”中创建的代码如下所示。

978-7-111-33316-6-Chapter09-46.jpg

978-7-111-33316-6-Chapter09-47.jpg

3)用GCC编译运行程序,结果如图9-11所示。

978-7-111-33316-6-Chapter09-48.jpg

图9-11 等待进程的运行结果

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈