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

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()和waitpid()_第1张图片

wait()举例

#include 
#include 
#include 
#include 
#include 
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;
 }

运行截图如下:

小何讲进程: 阻塞进程函数 wait()和waitpid()_第2张图片


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

小何讲进程: 阻塞进程函数 wait()和waitpid()_第3张图片

waitpid()举例

#include
#include
#include
#include
#include

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;
}

运行截图如下:

小何讲进程: 阻塞进程函数 wait()和waitpid()_第4张图片

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

程序的流程图如下图:

小何讲进程: 阻塞进程函数 wait()和waitpid()_第5张图片

你可能感兴趣的:(linux编程,Linux环境下C程序开发)