进程控制开发之:Linux进程控制编程
3)waitpid()使用实例。
由于wait()函数的使用较为简单,在此仅以waitpid()为例进行讲解。本例中首先使用fork()创建一个子进程,然后让其子进程暂停5s(使用了sleep()函数)。接下来对原有的父进程使用waitpid()函数,并使用参数WNOHANG使该父进程不会阻塞。若有子进程退出,则waitpid()返回子进程号;若没有子进程退出,则waitpid()返回0,并且父进程每隔一秒循环判断一次。该程序的流程图如图7.5所示。
图7.5waitpid示例程序流
该程序源代码如下所示:
/*waitpid.c*/
#includesys/types.h>
#includesys/wait.h>
#includeunistd.h>
#includestdio.h>
#includestdlib.h>
intmain()
{
pid_tpc,pr;
pc=fork();
if(pc0)
{
printf(Errorforkn);
}
elseif(pc==0)/*子进程*/
{
/*子进程暂停5s*/
sleep(5);
/*子进程正常退出*/
exit(0);
}
else/*父进程*/
{
/*循环测试子进程是否退出*/
do
{
/*调用waitpid,且父进程不阻塞*/
pr=waitpid(pc,NULL,WNOHANG);
/*若子进程还未退出,则父进程暂停1s*/
if(pr==0)
{
printf(Thechildprocesshasnotexitedn);
sleep(1);
}
}while(pr==0);
/*若发现子进程退出,打印出相应情况*/
if(pr==pc)
{
printf(Getchildexitcode:%dn,pr);
}
else
{
printf(Someerroroccured.n);
}
}
}
将该程序交叉编译,下载到目标板后的运行结果如下所示:
$./waitpid
Thechildprocesshasnotexited
Thechildprocesshasnotexited
Thechildprocesshasnotexited
Thechildprocesshasnotexited
Thechildprocesshasnotexited
Getchildexitcode:75
可见,该程序在经过5次循环之后,捕获到了子进程的退出信号,具体的子进程号在不同的系统上会有所区别。
读者还可以尝试把“pr=waitpid(pc,NULL,WNOHANG);”这句改为“pr=waitpid(pc,NULL,0);”或者“pr=wait(NULL);”,运行的结果为:
$./waitpid
Getchildexitcode:76
可见,在上述两种情况下,父进程在调用waitpid()或wait()之后就将自己阻塞,直到有子进程退出为止。
linux操作系统文章专题:linux操作系统详解(linux不再难懂)
评论