【UNIX】进程系统调用的wait/waitpid()函数

1)wait()函数

在进程中通过fork函数可以创建父子进程,在两个进程中,父子进程可以执行自己的进程,进程的执行也有先后顺序,当调用该函数时可以是进程阻塞成等待状态,直到一个子进程或者该进程收到一个信号为止。如果该进程没有子进程或者子进程已经结束,该函数会立即返回。

下面是wait()函数的一般形式:


/*
* #include
     
     
      
      
* #include
      
      
       
       
* #include
       
       
        
        
* #include
        
        
         
         
*
* pid_t wait (int *status)
* pid_t wait (pid_t pid ,int *status, int options)
* status是一个整型指针,指向的对象用来保存子进程退出时的状态,
* status是空NULL,表示忽略退出时的状态,
* 子进程的退出状态可以用特定的宏测定  
*  WIFEXITED(status)
*  status = WEXITSTATUS(status)
*
*   options一般有三种:  WNOHANG 表示不等待,waitpid不阻塞,直接返回值是0;
*                        0:此时和wait函数相同
*/

int main ()
{
    int status;
    pid_t pid ;
    
    printf("parent[pid=%d] is born\n", getpid());
		 
    if( pid = fork() < 0){
        perror ("fork");
        exit (-1);
   }
   if (pid == 0){
         printf("child[pid=%d] is born\n", getpid());
        sleep(10);
        exit (123);
        
   }else{
    pid_t pid_w;
   
    pid_w = wait (&status);//返回状态就是exit()函数的值
    if (WIFEXITED(status)){
        status = WEXITSTATUS(status);
        printf("wait returns with pid = %d. return status is %d\n",
                pid_w, status);     //wait函数等待的pid_w就是子进程的pid号
    }
    printf("father is over\n");
    
    return 0;

   }
    
}


//example 2 waitpid:

int main(int argc, char **argv)
{
	pid_t pid;

	printf("parent[pid=%d] is born\n", getpid());
		 
	if (-1 == (pid = fork())) {
		perror("fork error");
		return 1;
	}
	
	if (pid == 0){
		printf("child[pid=%d] is born\n", getpid());
		sleep(10);
		printf("child is over\n");
	}
	else{ //parent
		pid_t pid_w;
		while((pid_w = waitpid(pid, NULL, WNOHANG)) == 0) {
			printf("child is still living, parent wait w/o HAND and returns with 0\n");
			sleep(1);
		}
		printf("waitpid returns with pid = %d.\n", pid_w);
		
		printf("father is over\n");
	}
	
	return 0;
}

/*
 waitpid 中的pid_t pid 其值可以有几种
 1:pid>0表示只等待进程ID等于你输入的ID值,不管其他子进程有没有结束,父进程会一直等你
    给的ID结束才返回等待,
2: pid = -1 表示等待任何子进程结束,才结束等待,
3:pid =0 等待其组ID等于调用的组ID的任一子进程,

*/

        
        
       
       
      
      
     
     



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值