Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1494328
  • 博文数量: 204
  • 博客积分: 4013
  • 博客等级: 中校
  • 技术积分: 4030
  • 用 户 组: 普通用户
  • 注册时间: 2011-12-29 06:34
文章分类

全部博文(204)

文章存档

2012年(204)

分类: 嵌入式

2012-03-11 02:43:01

    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实例:

 
阅读(1316) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~