Linux的fork函数和进程替换
文章目录
- 一、fork函数
- 1.使用fork建立子进程
- 2.fork后
- 不同进程中的同一变量的虚拟地址
- 写时拷贝
- 二、进程替换
一、fork函数
在Linux中,fork函数具有非常重要的作用;它可以在原有进程(父进程)中创建一个新进程(子进程)。
fork函数所在的头文件即其返回值类型(上图)。
父进程的返回值为子进程id,子进程的返回值为0。
若进程出错则返回-1。
1.使用fork建立子进程
代码如下(示例):
1 #include<stdio.h>2 #include<unistd.h>3 #include<stdlib.h>4 5 int main()6 {7 pid_t id=fork();8 if(id==0){9 printf("I am child\n");10 sleep(3);11 exit(0);12 13 }14 else{15 printf("I am father\n");16 sleep(4); 17 exit(0);18 }19 20 return 0;21 }
运行结果(下图)
2.fork后
不同进程中的同一变量的虚拟地址
fork创建子进程后,对于同一个变量test,父子进程在运行时有何不同,如果对父进程的test进行修改,子进程的test会改变吗?
看下面代码
1 #include<stdio.h>2 #include<unistd.h>3 #include<stdlib.h>4 5 int main()6 {7 int test=666;8 9 pid_t id=fork();10 if(id==0){11 printf("I am child,test is %d,test_id:%p\n",test,&test);12 sleep(3);13 exit(0);14 15 }16 else{17 test=999;18 printf("I am father,test is %d,test_id:%p\n",test,&test); 19 sleep(3);20 exit(0);21 }22 23 return 0;24 }
其运行结果如下图
我们可以看到对父进程的test修改后,子进程的test并未改变,这是因为进程具有独立性。
但是为什么父子进程中变量test的地址相同呢?在同一个地址中为什么会有两个不同的值?
首先我们知道地址分为物理地址和虚拟地址,虚拟地址通过页表转换为物理地址。而我们所打印出来的地址属于虚拟地址,而两个test的值不同说明test所在的物理地址不同(说明不同进程的同一虚拟地址可以指向不同的物理地址)。
写时拷贝
写时拷贝是指在刚刚创建子进程时,父子进程的代码和数据都是共享的,如果子进程仅仅只有对数据的读操作那么只需要让子进程空间的指针指向原空间,只有当子进程进行“写操作”或者修改代码内容后才真正为子进程开辟新空间。
从上面我们知道,在创建子进程后,即使父子进程的内容发生改变,他们的虚拟地址也没有改变,因此写时拷贝时发生在物理层面上。
写时拷贝可以做到资源的按需分配和延时分配,更高效的使用内存空间。
二、进程替换
fork创建一个子进程后,为了让子进程执行不同的任务,我们需要让子进程调用一个exec函数来执行其他程序。
注意:调用exec函数并不是创建一个新进程,而是对原进程内容进行替换,其进程id不会变换。
返回值问题:调用exec函数后,如果调用成功,那么该函数不再返回;如果调用失败则返回-1.
man手册对exec函数的解释(下图)
l(list):参数采用列表形式
v(vector):参数采用数组形式
p(path):自动搜索环境变量PATH,不需要用户给出路径
e(env):自己维护环境变量
execl,execlp,execv,execvp调用ls -al命令
#include<stdlib.h>#include <unistd.h>int main() {char *const myargv[] = {"ls", "-la", NULL};char *const myenvp[] = {"PATH=/bin", NULL};//l表示参数采用列表形式 execl("/bin/ls", "ls","-l","-a" ,NULL); //p无需写全路径 execlp("ls", "ls", "-la", NULL); //v参数采用数组形式 execv("/bin/ls", myargv); //p execvp("ls", myargv); exit(0);}
Linux的fork函数和进程替换相关推荐
- linux 进程函数替换,Linux使用exec函数实现进程替换的代码分享
这篇文章主要介绍了Linux 进程替换(exec函数)实现代码的相关资料,需要的朋友可以参考下 Linux 进程替换(exec函数)实现代码# include #include #include #i ...
- 理解进程、通过调用 fork 函数创建进程
文章目录 1.理解进程 1.1 CPU核的个数与进程数 1.2 进程 ID 2.通过调用 fork 函数创建进程 1.理解进程 进程(Process),其定义如下:"占用内存空间的正在运行的 ...
- Linux中fork()函数详解
Linux中fork()函数详解 一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事, ...
- Linux系统编程之进程控制(进程创建,fork函数,进程中止,进程等待,程序替换)
进程创建 fork()------复制,返回值,写时复制 vfork()创建子进程-子进程与父进程共用同一块虚拟地址空间, 为了防止调用栈混乱,因此阻塞父进程直到子进程调用exit()退出或者进行程序 ...
- Linux系统【一】CPU+MMU+fork函数创建进程
切板中的内容输出到文件### 进程相关概念 程序:编译好的二进制文件,在磁盘上,不占用系统资源(不包括磁盘).(剧本) 进程:占用系统资源,是程序的一次运行.(戏剧) 一个程序可以产生多个进程,一个进 ...
- linux中fork函数及子进程父进程执行顺序
目录 一.fork入门知识 二.fork进阶知识 一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以 ...
- Linux多进程拷贝fork,浅析linux中fork函数
Linux通过clone()系统调用实现fork().vfork()和__clone()库函数创建新的进程,这个调用通过一系列的参数标志来指明父子进程的共享资源,终将各自的参数标志位传递给clone, ...
- fork函数产生进程
Chinaunix首页 | 论坛 | 认证专区 | 博客 登录 | 注册 hhktonybutbueatiful.blog.chinaunix.net 目标赋予我们生命的意义和目的.有了目标,我们才会 ...
- linux 的fork函数原型,浅析fork()和底层实现
记得以前初次接触fork()函数的时候,一直被"printf"输出多少次的问题弄得比较晕乎.不过,"黄天不负留心人".哈~ 终于在学习进程和进程创建fork相关 ...
最新文章
- 设计一个shell程序,在/userdata目录下建立50个目录,并对每个目录给754权限!
- python网络爬虫系列(六)——数据提取 lxml模块
- 用微前端的方式搭建类单页应用
- [2-sat]HDOJ3622 Bomb Game
- How to get the xpath by clicking an html element
- [20171120]bash使用here documents的细节
- 获取网站icon图标
- ElasticSearch7.3.0 集群搭建及配置安全认证
- E - Eddy的难题
- JavaScript 扁平化数组转成Tree
- 如何计算芯片的ESP mac 地址
- 微信每天处理2.05亿通话 运营商只剩卖流量
- 云剪智能混剪软件/批量剪辑工具技术源码框架---- 一键生成上亿条原创视频
- 登陆失败:用户账户限制。可能的原因包括不允许空密码.........解决方案
- 服务器虚拟化 魔力象限,Gartner:VMware成虚拟化魔力象限领导者
- linux操作系统下c语言编程入门
- 磁盘分区管理工具(DiskGenius Pro 5.3)pjb 附安装教程
- Cocos2d-x 3.x 图形学渲染系列二十三
- iview card布局
- JAVA 攻城狮 第三天
热门文章
- C++ ofstream崩溃记录
- java-php-python-ssm汽车出租平台计算机毕业设计
- java安装心得_JAVA实验环境搭建与实验心得
- Hadoop读书笔记(八)MapReduce 打成jar包demo
- UEFI+GPT+USB3.0+SSD 安装win7(X64)
- linux 安腾,Linux/Windows谁能推动安腾增长?分歧很大(转)
- JavaCV - 毛玻璃特效
- Android开发之自定义View
- 【PS功能学习】12:让我们换一种颜色看世界(调色一)
- 画个球啊(上)——纯C语言绘制圆球