wait函数是用于使父进程(也就是调用wait的进程)阻塞,直到一个子进程结束或者该进程接到了一个指定的信号为止。 如果该父进程没有子进程或者他的子进程已经结束,则wait就会立即返回。
waitpid的作用和wait一样, 但它并不一定要等待第一个终止的子进程, 它还有若干选项,如可提供一个非阻塞版本的wait功能,也能支持作业控制。实际上wait函数只是waitpid函数的一个特例,在Linux内部实现wait函数时直接调用的就是waitpid函数。
wait函数调用形式:
#include
#include
pid_t wait(int *status)
这里的status是一个整型指针,是该子进程退出时的状态
status若为空,则代表任意状态结束的子进程
status若不为空,则代表指定状态结束的子进程
另外,子进程的结束状态可由Linux中一些特定的宏来测定
成功的话返回子进程的进程号 ,失败则返回-1
waitpid函数调用形式:
#include
#include
pid_t waitpid(pid_tpid,int* stat_loc,int options);
作用:waitpid等待指定的子进程直到子进程返回,如果pid为正值则等待指定的进程(pid);如果为0则等待任何一个组ID和调用者的组ID相同的进程;为-1时等同于wait调用;小于-1时等待任何一个组ID等于pid绝对值的进程。
参数含义:stat_loc和wait的意义一样;
options可以决定父进程的状态,可以取下面两个值:
WNOHANG:当没有子进程存在时,父进程立即返回; WUNTACHED:当子进程结束时waitpid返回,但是子进程的退出状态不可得到.
/*waitpid.c*/
#include
#include
#include
#include
#include
int main()
{
pid_t pc,pr;
pc=fork();
if(pc<0)
printf("Error fork.\n");
/*子进程*/
else if(pc==0){
/*子进程暂停5秒*/
sleep(5);
/*子进程正常退出*/
exit(0);
}
/*父进程*/
else{
/*循环测试子进程是否退出*/
do{
/*调用waitpid,且父进程不阻塞*/
pr=waitpid(pc,NULL,WNOHANG);
//pr=wait(NULL);
/*若子进程还未退出,则父进程暂停1s*/
if(pr==0){
printf("The child process has not exited\n");
sleep(1);
}
}while(pr==0);
/*若发现子进程退出,打印出相应情况*/
if(pr==pc)
printf("Get child %d\n",pr);
else
printf("some error occured.\n");
}
}
waitpid运行
将源码文件waitpid.c保存到/nfs/project目录下并交叉编译:
[root@localhost project]# arm-linux-gcc -o waitpid waitpid.c
将板子启动Linux,并挂载网络文件系统,然后进入/project目录下面,运行waitpid实例:
阅读(1163) | 评论(0) | 转发(0) |