首页 理论教育 Linux系统编程中的僵尸进程处理及示例

Linux系统编程中的僵尸进程处理及示例

时间:2023-11-16 理论教育 版权反馈
【摘要】:wait函数用于使父进程阻塞,直到一个子进程终止或者该进程接到了一个指定的信号为止。图8.2例8.6流程图此例中的子进程运行时间明显比父进程时间长。为了避免子进程成为僵尸进程,父进程调用wait阻塞父进程的运行,等待子进程正常结束后才继续运行,直到正常结束。表8.11wait函数例8.7设计一个程序,要求用户可以选择是否复制进程,子进程模仿思科1912交换机的开机界面,以命令行的方式让用户进行选择,父进程判断子进程是否正常终止。

Linux系统编程中的僵尸进程处理及示例

僵尸进程(zombie),是指已终止运行但尚未被清除的进程,又称为过渡进程。

当使用fork函数创建子进程时,由于子进程有可能比父进程晚终止(即父进程终止后,子进程还没终止),子进程就成了僵尸进程。为避免这种情况,可以在父进程中调用wait或waitpid函数。

wait函数用于使父进程阻塞,直到一个子进程终止或者该进程接到了一个指定的信号为止。

waitpid的作用和wait一样,但它并不一定要等待第一个终止的子进程,它还有若干选项,也能支持作业控制。

实际上wait函数只是waitpid函数的一个特例,在Linux内部实现wait函数时直接调用的就是waitpid函数。

例8.6 设计一个程序,要求复制进程,子进程显示自己的进程号(PID)后暂停一段时间,父进程等待子进程正常结束,打印显示等待的进程号(PID)和等待的进程退出状态。

编辑源程序代码:

例8.6流程图如图8.2所示。

图8.2 例8.6流程图

此例中的子进程运行时间明显比父进程时间长。为了避免子进程成为僵尸进程,父进程调用wait阻塞父进程的运行,等待子进程正常结束后才继续运行,直到正常结束。

wait函数说明如表8.11所示。

表8.11 wait函数

例8.7 设计一个程序,要求用户可以选择是否复制进程,子进程模仿思科(Cisco)1912交换机的开机界面,以命令行的方式让用户进行选择,父进程判断子进程是否正常终止。

流程图如图8.3所示。(www.xing528.com)

图8.3 例8.7流程图

编辑源程序代码:“

编译、运行程序,提示是否复制进程,先选择“2.不复制进程”,此时没有产生子进程,返回值为“0”。

再次运行程序后,选择“1.复制进程”,此时产生子进程,子进程的功能是模拟交换机的开机界面,提示选择画面,这时选择0,进入子程序display0,等待子程序运行终止后,返回值为“1”,父进程才终止。

修改程序:不用waitpid函数。

再次运行程序后,选择“1.复制进程”,这时候父进程没有等待子进程,也就是在模拟显示完交换机的开机界面后,根本没来得及输入选择,父进程就终止了,子进程就变成了僵尸进程。

由此例可以看出,在没有语法、语义等错误的情况下,程序还是没有完成设计要求。可见,在多进程程序设计时,除了养成使用完后就终止的良好习惯,还要让子进程工作完成后再终止,这个时候父进程就得灵活使用wait函数和waitpid函数。

waitpid函数说明如表8.12所示。

表8.12 waitpid函数

续表

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

我要反馈