进程控制开发之:Linux进程控制编程
函数返回值 | 成功:已结束运行的子进程的进程号 |
表7.7列出了waitpid()函数的语法规范。
表7.7 waitpid()函数语法
所需头文件 | #include <sys/types.h> |
函数原型 | pid_t waitpid(pid_t pid, int *status, int options) |
续表
函数传入值 | Pid | pid > 0:只等待进程ID等于pid的子进程,不管已经有其他子进程运行结束退出了,只要指定的子进程还没有结束,waitpid()就会一直等下去 | ||
pid = -1:等待任何一个子进程退出,此时和wait()作用一样 | ||||
pid = 0:等待其组ID等于调用进程的组ID的任一子进程 | ||||
pid < -1:等待其组ID等于pid的绝对值的任一子进程 | ||||
status | 同wait() | |||
options | WNOHANG:若由pid指定的子进程不立即可用,则waitpid()不阻塞,此时返回值为0 | |||
WUNTRACED:若实现某支持作业控制,则由pid指定的任一子进程状态已暂停,且其状态自暂停以来还未报告过,则返回其状态 | ||||
0:同wait(),阻塞父进程,等待子进程退出 | ||||
函数返回值 | 正常:已经结束运行的子进程的进程号 | |||
使用选项WNOHANG且没有子进程退出:0 | ||||
调用出错:-1 |
3)waitpid()使用实例。
由于wait()函数的使用较为简单,在此仅以waitpid()为例进行讲解。本例中首先使用fork()创建一个子进程,然后让其子进程暂停5s(使用了sleep()函数)。接下来对原有的父进程使用waitpid()函数,并使用参数WNOHANG使该父进程不会阻塞。若有子进程退出,则waitpid()返回子进程号;若没有子进程退出,则waitpid()返回0,并且父进程每隔一秒循环判断一次。该程序的流程图如图7.5所示。
图7.5 waitpid示例程序流
该程序源代码如下所示:
/* waitpid.c */
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
pid_t pc, pr;
pc = fork();
if (pc < 0)
{
printf("Error fork\n");
}
else if (pc == 0) /*子进程*/
{
/*子进程暂停5s*/
sleep(5);
/*子进程正常退出*/
exit(0);
}
else /*父进程*/
{
/*循环测试子进程是否退出*/
do
{
/*调用waitpid,且父进程不阻塞*/
pr = waitpid(pc, NULL, WNOHANG);
/*若子进程还未退出,则父进程暂停1s*/
if (pr == 0)
{
printf("The child process has not exited\n");
sleep(1);
}
} while (pr == 0);
/*若发现子进程退出,打印出相应情况*/
if (pr == pc)
{
printf("Get child exit code: %d\n",pr);
}
else
{
printf("Some error occured.\n");
}
}
}
将该程序交叉编译,下载到目标板后的运行结果如下所示:
$./waitpid
The child process has not exited
The child process has not exited
The child process has not exited
The child process has not exited
The child process has not exited
Get child exit code: 75
可见,该程序在经过5次循环之后,捕获到了子进程的退出信号,具体的子进程号在不同的系统上会有所区别。
读者还可以尝试把"pr = waitpid(pc, NULL, WNOHANG);"这句改为"pr = waitpid(pc, NULL, 0);"或者"pr = wait(NULL);",运行的结果为:
$./waitpid
Get child exit code: 76
可见,在上述两种情况下,父进程在调用waitpid()或wait()之后就将自己阻塞,直到有子进程退出为止。
进程控制 Linux fork() 函数 操作系统 相关文章:
- 进程控制开发之:Linux进程概述(08-13)
- 进程控制开发之:Linux守护进程(08-13)
- 进程控制开发之:实验内容(08-13)
- REDIce-Linux--灵活的实时Linux内核(11-12)
- linux文件系统基础(02-09)
- Linux标准趋向统一(11-12)