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 区别 ?
    回答就是前两个问题的答案

*/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实验3 进程的管理 一、实验内容 实验一  编写代码,实现以下功能:  打印当前所有环境变量的值;  添加新的环境变量NEWENV=first;  修改环境变量NEWENV的值为second;  打印环境变量NEWENV的值。 实验二  编写代码实现以下功能:  1.打印字符串“hello world!”  2.在打印字符串“hello world!”前调用三次fork,分析打印结果。 实验三  创建子进程  1.在子进程打开文件file1,写入自己的“班级_姓名_学号”,  2.进程读取file1的内容,并且打印显示。  3.在进程获取已经结束的子进程的状态信息,打印该信息,并且打印结束的子进程进程号。 实验四  编写程序实现以下功能:  1,在进程定义变量n,在子进程变量n进行++操作;并且打印变量n的值,打印子进程pid;  2,在进程打印变量n的值,并且打印进程pid。  3,要求分别用fork和vfork创建子进程。 实验五  创建子进程一,在子进程递归打印/home目录的内容(用exec系列函数调用第二次实验的代码完成此功能);  1.子进程结束的时候完成以下功能:  打印字符串“Child process exited!”  打印子进程标识符,打印进程标识符。  2. 创建子进程二, 打印子进程运行环境环境变量“USER”的值,通过exec系列的某个函数设置子进程”USER”环境变量值为“zhangsan”,并且让该子进程完成以下命令:“ls –li /home”.

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值