小何讲进程: 阻塞进程函数 wait()和waitpid()

25 篇文章 22 订阅
1.  wait()和waitpid()函数说明

wait()

             进程一旦调用了wait(), 就立即阻塞自己,由wait自动分析是否有当前进程的某个子进程已经退出,如果让它找到了一个已经变成僵尸的子进程,wait就会收集这个子进程的信息,并把它彻底销毁后返回;如果没有找到这样一个子进程,wait就会一直阻塞在这里,直到一个子进程结束或者该进程接到了一个指定的信号为止。


waitpid()
     waitpid()的作用和wait()一样,但它并不一定要等待第一个终止的子进程,它还有若干选项,如可提供一个非阻塞版本的wait()功能等。实际上wait()函数只是waitpid()函数的一个特例,在Linux内部实现wait()函数时直接调用的就是waitpid()函数。
wait()函数的实现:

static inline  pid_t  wait(int *wait_stat)
{
	return waitpid(-1,wait_stat,0);
}


2.  wait()和waitpid()函数格式说明

(1)  wait()函数格式如下:


wait()举例

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
int main()
{       
	int status; 
        pid_t pc,pr;    
   	pc=fork();      
	if(pc<0)  
	{
		printf("error ocurred!\n");   	
	}    
      	
     	else if(0==pc)    
        {
		printf("this is child process whit pid of %d\n",getpid());  
                exit(3);         
        }   
 	else
 	{           
    		pr=wait(&status); 
               if (WIFEXITED(status))   
               {
			printf("the child process %d exit normally.\n",pr);       
             		printf("the return code is %d.\n",WEXITSTATUS(status));       
               }         
     	       else   
		{
			printf("the child process %d exit abnormally.\n",pr);   
		}      
		       
        }   
	return 0;
 }

运行截图如下:



(2)   waitpid()函数格式如下


waitpid()举例

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/wait.h>
#include<sys/types.h>

int main(void)
{
	pid_t pc,pr;
	pc=fork();
	if(pc<0)
	{
		printf("Error fork \n");
	}
	else if(pc==0)
	{
		sleep(5);
		exit(0);
	}
	else
	{
		do
		{
			pr=waitpid(pc,NULL,WNOHANG);
			if(pr==0)
			{
				printf("The child process has not exited \n");
				sleep(1);
			}
		}while(pr==0);
	
		if(pr==pc)
		{
			printf("Get child exit code: %d\n ",pr);			
		}
		else
		{
			printf("Some error occured. \n");
		}
	}

	return 0;
}

运行截图如下:


本例中首先使用fork()创建一个子进程,然后让其子进程暂停5s(使用了sleep()函数)。
接下来对原有的父进程使用waitpid()函数,并使用参数WNOHANG使该父进程不阻塞。
若有子进程退出,则waitpid()返回子进程号;
若没有子进程退出,则waitpid()返回0,并且父进程每隔一秒循环判断一次。

程序的流程图如下图:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值