Linux高级编程基础——进程之 fork 与 vfork 使用

进程之 fork 与 vfork 使用

编写程序实现以下功能:

  1. 在父进程中定义变量n,在子进程中对变量n进行++操作;并且打印变量n的值,打印子进程pid;
  2. 在父进程中打印变量n的值,并且打印父进程pid。
  3. 要求分别用fork和vfork创建子进程。
#include <sys/types.h>
#include <sys/wait.h> 
#include <unistd.h>  
#include <stdio.h>  
#include <stdlib.h>
#include <fcntl.h> 
int main()
{	
	int n=1;  
	
	pid_t pid=fork(); //使用fork 创建子进程,得到一个返回值(pid),通过这个返回值可以判断一个进程是 子进程 还是 父进程
		   
	if(pid == 0)   //pid 为0 时,是子进程
    	    { 
	        n++;	
	        printf("fork出的子进程中n=%d\n",n); //打印子进程中 n++的结果		
	       exit(0);     
	    } 
    	else{
		sleep(1);
                printf("父进程中n=%d\n",n);   //打印父进程中 n的结果
		printf("fork出的子进程为pid:%d\n",pid);//这个返回值(pid)在父进程中返回的是 子进程的 ID
		printf("父进程的pid:%d\n",getpid());	//打印父进程的 ID	 

		pid_t pid1=vfork();//使用 vfork 创建子进程,得到一个返回值( pid1 )

	        if(pid1 == 0)  //pid 为0 时,是子进程
    	            { 
	                 sleep(2);
		         n++;
                         printf("vfork 出的子进程中n=%d\n",n); 	//打印子进程中 n++的结果	
		         exit(0);     	
                    }
	        else {
                     printf("父进程中n=%d\n",n);  //打印父进程中 n的结果
	             printf("pid1:%d\n",pid1);
		     printf("父进程的pid:%d\n",getpid());		
	             }
	     }
      return 0;        
}

/*

  1. fork出来的子进程打印的 n 于 父进程打印的 n 的值一样吗?
    不一样 ,因为fork创建的子进程是完全复制父进程的资源,之后独立于父进程之外
  2. vfork出来的子进程打印的 n 于 父进程打印的 n 的值一样吗?
    一样 ,vfork函数并不将父进程的地址空间完全复制到子进程中。而是与父进程共享资源
  3. vfork 于 fork 区别 ?
    回答就是前两个问题的答案

*/

猜你喜欢

转载自blog.csdn.net/qq_40663274/article/details/83904551