文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>linux进程开发之(五):wait()与waitpid

linux进程开发之(五):wait()与waitpid

时间:2010-10-25  来源:andyluo324324

wait函数是用于使父进程(也就是个调用wait的进程)阻塞,直到一个子进程结束或者该进程 接到了一个指定的信号为止.下面具体分析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();//创建一子进程
 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<sys/types.h>
#include<sys/wait.h>
2)函数原型 pid_t wait(int *status)
3)函数的入口参数
这里的status是一个整型指针,是该进程退出的状态
.status若为空,则代表任意状态结束的子进程
.status若不为空,则代表指定状态结束的子进程
另外,子进程的结束状态可由linux中一些特定的宏来测试。
4)函数返回值
成功:子进程的进程号
失败:-1
waitpid函数语法
1)所需要的头文件
#include<sys/types.h>
#include<sys/wait.h>
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
相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载