进程创建和替换——fork和exec

2023-05-16

fork

fork是UNIX系统中产生新进程的唯一办法

fork的作用是复制当前进程,生成子进程,子进程从fork的位置继续执行。fork函数的特点概括起来就是“调用一次,返回两次”,在父进程中调用一次,在父进程和子进程中 各返回一次。fork就像一个叉子,把顺序执行的程序变成了两个分支,并发执行

fork调用失败返回-1,子进程中fork的返回值是0,而父进程中fork的 返回值则是子进程的id

fork的用法

  1. 一个进程创建一个自身的副本,这样每个副本都 可以在另一个副本执行其他任务的同时处理各自的某个操作。 这是网络服务器的典型用法;
  2. 一个进程想要执行另一个程序。既然创建新进程的唯一办法是调用fork, 该进程于是首先调用fork创建一个自身的副本,然后另一个副本(通常为子进程)调用exec把自身替换成新的程序。 这是shell之类程序的典型用法;

在父进程调用fork以后要用变量记录返回值即子进程的pid,否则就找不到子进程了,而子进程可以通过getppid找到父进程。

#include <stdio.h>
#include <unistd.h>

int main()
{
	pid_t pid;
	pid = fork();
	if(-1 == pid){
		perror("fork");
		exit(1);
	}
	if(0 == pid){
		printf("i am child, %d\n",getpid());
	}
	else if(pid >0){
		printf("i am parent, %d\n",getpid());
	}

}

i am child, 5909
[root@192 ~]# i am parent, 5910

写时拷贝

一般情况下,子进程和父进程共享地址空间,当有一方需要对数据内容进行修改的话,对各自拷贝一份副本(拷贝修改数据的页表)。由于代码段肯定是不会改变的,所以代码段一直享用同一块地址空间。

int g_val = 0;

int main()
{
	pid_t pid = fork();
	if(pid == 0){
		//子进程
		g_val = 100;
		printf("child val=%d, &val = %d\n", g_val, &g_val);
	}
	else{
		sleep(3);
		printf("parent val=%d, &val = %d\n", g_val, &g_val);
	}
}


child val=100, &val = 134518596
parent val=0, &val = 134518596

运行结果说明:

  1. 两个变量内容不同,说明两个进程各存有一份变量
  2. 两个变量地址一样,说明是虚拟地址

vfork

  1. 保证了子进程先于父进程执行
  2. 子进程执行完如果不使用exit,会修改main栈帧,导致父进程段错误
  3. vfork不存在写时拷贝,效率高
  4. 通常不使用vfork,有问题
int main()
{
	int  r = 10;
	pid_t pid = vfork();
	if(pid == 0){
		sleep(1);
		r = 1;
		printf("child  %d\n", r);
		exit(0);
	}
	else{
		printf("parent %d\n", r);
	}
}

child 1
parent 1

exec

原进程pcb中信息是通过三级映射将虚拟空间映射在内存空间,exec删除进程pcb信息,从磁盘把新代码调入内存,再形成pcb里的映射。

用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序。调用exec并不创建新进程,所以调用exec前后该进程的id并未改变。
调用成功就执行新代码,调用失败返回-1.
例参考博客文章,简易shell。

exec实现重定向

调用exec后,原来打开的文件描述符仍然是打开的。

解释:在Unix/Linux中,父进程调用fork出一个子进程,父进程打开的文件描述符会被复制到子进程中,这样子进程通过父进程复制过来的文件描述符和父进程共享打开文件的文件表项。

而exec则会继承子进程的文件描述符,也就是说在子进程中打开的文件流都可以在exec后的新进程中使用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

进程创建和替换——fork和exec 的相关文章

随机推荐

  • 备忘录模式

    备忘录模式 标签 xff1a Java与设计模式 备忘录模式 在不破坏封装性的前提下 捕获一个对象的内部状态 or 拷贝 并在该对象之外保存这个状态 这样以后就可 将该对象恢复到原先保存的状态 图片来源 设计模式 可复用面向对象软件的基础
  • 迭代器模式

    迭代器模式 标签 xff1a Java与设计模式 迭代器模式 提供一种方法顺序访问聚合对象 如List Set 内的每个元素 而又不暴露聚合对象的内部实现 图片来源 设计模式 可复用面向对象软件的基础 模式实现 Iterator amp A
  • Ubuntu 更换 apt 镜像源

    Ubuntu 更换 apt 镜像源 apt 是 Ubuntu 系的包管理工具 xff0c 一般默认使用 ubuntu 的官方源 http archive ubuntu com 在国内下载的速度慢到让人想砸电脑 xff0c 可以更换为国内的镜
  • 简洁的Java8

    简洁的Java8 Stream 标签 xff1a Java基础 再次回到阿里 感觉变化好大 一是服务资源Docker化 最牛逼的阿里DB团队竟然把DB放到了容器中 还放到了线上环境 二是全集团Java8 记得离开时还是1 6 1 5 甚至还
  • 学习信号量 sem_init、sem_destroy、sem_post、sem_wait、sem_trywait、sem_getvalue

    学习信号量 sem init sem destroy sem post sem wait sem trywait sem getvalue 概要 xff1a 1 信号量使用场合 2 POSIX标准定义的信号量 2 1 sem init se
  • Intel Realsense windows安装与入门

    realsense400系列介绍 xff1a https www intelrealsense com stereo depth utm source 61 intelcom website amp utm medium 61 button
  • 到底什么是数据架构,如何管理,谁来负责?

    理解概念是理解数据管理的第一步 xff0c 很多概念我们知道 xff0c 但内涵却不清楚 xff0c 或者你以为清楚 xff0c 这类澄清概念的文章可以很好的帮到你 xff01 源于数据治理周周谈 xff0c 作者徐康 随着数据治理工作的深
  • linux下安装yum步骤

    一 安装yum前下介绍以下知识 1 yum介绍 Yum xff08 全称为 Yellow dog Updater Modified xff09 是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器 基于RPM包管
  • C++工程的CMakeLists.txt文件编写

    最简单的demo工程如下 xff1a include lt iostream gt include lt string gt int main int argc char argv std cout lt lt 34 hello world
  • windows/linux下Qt可执行程序打包,linux桌面双击运行程序sh脚本

    1 windows下Qt打包 windows下Qt的可执行文件打包简单的来说就是利用Qt自带依赖的打包工具windeployqt进行打包 xff0c 该工具存在Qt安装目录下 xff0c 执行命令为 xff1a windeployqt na
  • opengl、opengl es、webgl介绍与opengl开发入门

    1 OpenGL OpenGL xff08 英语 xff1a Open Graphics Library xff0c 译名 xff1a 开放图形库或者 开放式图形库 xff09 常用于CAD 虚拟现实 科学可视化程序和电子游戏开发 Open
  • linux代码检测工具valgrind之内存检测memcheck

    1 安装命令 xff1a sudo apt get install valgrind 安装成功如下 xff1a 检测版本命令 xff1a valgrind version 2 valgrind检测工具tool介绍 xff08 1 xff09
  • 摄影成像原理

    转载 xff1a https www sohu com a 191146657 690175 摄影成像原理 照相机是个什么样的仪器 xff1f 为什么可以把外界景物浓缩到一张小小的照片上 xff1f 观察手中的照相机 xff0c 就会感到这
  • cmake, make, CMakeLists.txt, Makefile简介

    文章目录 cmake make CMakeList txt Makefile之间的关系参考文章链接 xff1a 转自个人博客 在各种开源项目中 xff0c 经常会发现项目中除了代码源文件 xff0c 还包含了 CMakeList txt M
  • 相机畸变校正详解

    转 xff1a https blog csdn net humanking7 article details 45037239 1 摄像机成像原理简述 成像的过程实质上是几个坐标系的转换 首先空间中的一点由 世界坐标系 转换到 摄像机坐标系
  • java错误:需要《标识符》

    出现如下错误 xff1a 上面的第一 第二 xff0c 第三个错误的原因是 xff1a 没有加函数返回值类型void 最后一个原因是 xff1a 关键字static错误 总之 xff0c 出现标识符错误 xff0c 就是说程序里的不是缺少标
  • Java的throws Exception

    转 xff1a https www cnblogs com feichengwulai articles 3793261 html 1 终极解释 xff01 xff01 xff01 throws Exception放在方法后边 xff0c
  • TX2从入门到放弃学习笔记(1)-基础

    一 资源简介 TX2作为TX1的改进版 xff0c 资源配置相当强劲 1 模组配置 256 core NVIDIA Pascal GPU ARMv8 64 bit Multi Processor CPU Complex Advanced H
  • 弹窗问题 Android Detected problems with API compatibility visit g.co/dev/appcompat for more info dialog

    原因是Android P之后Google限制了开发者调用非公开的API方法 xff0c 例如使用反射去调用SDK内部的非公开方法 xff0c 这样启动app的时候就会弹窗提示 xff0c 不过我们还是可以通过反射把他干掉 手动狗头 解决方法
  • 进程创建和替换——fork和exec

    fork fork是UNIX系统中产生新进程的唯一办法 fork的作用是复制当前进程 xff0c 生成子进程 xff0c 子进程从fork的位置继续执行 fork函数的特点概括起来就是 调用一次 xff0c 返回两次 xff0c 在父进程中