进程控制开发之:Linux进程控制编程

时间:2013-09-13来源:网络

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()之后就将自己阻塞,直到有子进程退出为止。

1 2 3 4 5

关键词: 进程控制 Linux 操作系统 fork() 函数

加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW

或用微信扫描左侧二维码

相关文章

查看电脑版