Chinaunix首页 | 论坛 | 博客
  • 博客访问: 686117
  • 博文数量: 240
  • 博客积分: 3616
  • 博客等级: 大校
  • 技术积分: 2663
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-21 23:59
文章分类

全部博文(240)

文章存档

2013年(6)

2012年(80)

2011年(119)

2010年(35)

分类: LINUX

2010-10-25 16:18:53

wait函数是用于使父进程(也就是个调用wait的进程)阻塞,直到一个子进程结束或者该进程
接到了一个指定的信号为止.下面具体分析waitpid.c程序.
#include
#include
#include
#include
#include
int main()
{
 pid_t pc,pr;
 pc=fork();//创建一子进程
 printf("the child pid is  %d\n",pc);
 if(pc<0)//出错处理
 {
  printf("Error fork \n");
 }
 else if(pc==0)//子进程暂停5s
 {
  sleep(5);
  exit(0);//子进程正常退出
 }
 else//父进程
 {
  do  //循环测试子进程是否退出
  {
   pr=waitpid(pc,NULL,WNOHANG);//调用waitpid,且父进程不阻塞
   if(pr==0)//若子进程还未退出,则父进程暂停1s
   {
    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 ocured \n"); 
  }
 
 }
}
/*--------------------------------------------------
notes:
1.wait和waitpid函数说明
wait函数是用于使父进程(也就是调用wait的进程)阻塞,直到一个子进程结束或者该
进程接到了一个指定的信号为止。如果该父进程没有子进程或者他的子进程已经结束,
则wait就会立即返回。
2.waitpid的作用和wait一样,但它并不一定要等待第一个终止的子进程,它还有若干
选项,如可提供一个非阻塞版本的wait功能,也能支持作业控制。实际上wait函数只是
waitpid函数的一个特例,在linux内部实现wait函数时直接调用的就是waitpid函数。
3.wait和waitpid函数格式说明
wait函数语法
1)所需头文件:
#include
#include
2)函数原型 pid_t wait(int *status)
3)函数的入口参数
这里的status是一个整型指针,是该进程退出的状态
.status若为空,则代表任意状态结束的子进程
.status若不为空,则代表指定状态结束的子进程
另外,子进程的结束状态可由linux中一些特定的宏来测试。
4)函数返回值
成功:子进程的进程号
失败:-1
waitpid函数语法
1)所需要的头文件
#include
#include
2)函数原型
pid_t waitpid(pid_t pid,int *status,int options)
3)函数传人值
pid:
pid>0:只等待进程ID等于ID的子进程,不管已经有其他子进程运行结束退出了,只要
指定的子进程还没有结束,waitpid就会一直等下出。
pid=-1:等待任何一个子进程退出,此时和wait作用一样。
pid=0:等待其组ID等于调用进程的组ID的任一子进程。
pid<-1:等待其组ID等于pid的绝对值的任一子进程。
status
options:
WNOHANG:若由pid指定的子进程不立即可用,则waitpid不阻塞,此时返回值为0
WUNTRACED:若实现某支持作业控制,则由pid指定的任一子进程状态已暂停,且
其状态自暂停以来还未报告,则返回其状态
0:同wait,阻塞父进程,等待子进程退出。
4)函数返回值
正常:子进程的进程号
使用选项WNOHANG且没有子进程退出:0
调用出错:-1
4.fork函数会运行两次,这里很关键。
--------------------------------------*/
 
实验:
1.
[root@localhost the_seventh_step]# gcc waitpid.c -o waitpid
2.
[root@localhost the_seventh_step]# ./waitpid
the child pid is  0
the child pid is  5737
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 5737
阅读(892) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-10-26 18:29:20

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com