关闭
关闭
首页 > 嵌入式软件 > linux

本文是关于 fork 和 exec 是如何在 Unix 上工作的。你或许已经知道,也有人还不知道。几年前当我了解到这些时,我惊叹不已。

本文引用地址: http://embed.21ic.com/software/linuxos/201801/50502.html

我们要做的是启动一个进程。我们已经在博客上讨论了很多关于系统调用的问题,每当你启动一个进程或者打开一个文件,这都是一个系统调用。所以你可能会认为有这样的系统调用:

start_process(["ls","-l","my_cool_directory"])

这是一个合理的想法,显然这是它在 DOS 或 Windows 中的工作原理。我想说的是,这并不是 Linux 上的工作原理。但是,我查阅了文档,确实有一个 posix_spawn 的系统调用基本上是这样做的,不过这不在本文的讨论范围内。

fork 和 exec

Linux 上的 posix_spawn 是通过两个系统调用实现的,分别是 fork 和 exec(实际上是 execve),这些都是人们常常使用的。尽管在 OS X 上,人们使用 posix_spawn,而 fork 和 exec 是不提倡的,但我们将讨论的是 Linux。

 

Linux 中的每个进程都存在于“进程树”中。你可以通过运行 pstree 命令查看进程树。树的根是 init,进程号是 1。每个进程(init 除外)都有一个父进程,一个进程都可以有很多子进程。

所以,假设我要启动一个名为 ls 的进程来列出一个目录。我是不是只要发起一个进程 ls 就好了呢?不是的。

我要做的是,创建一个子进程,这个子进程是我(me)本身的一个克隆,然后这个子进程的“脑子”被吃掉了,变成 ls。

开始是这样的:

my parent

|- me

然后运行 fork(),生成一个子进程,是我(me)自己的一份克隆:

my parent

|- me

|-- cloneof me

然后我让该子进程运行 exec("ls"),变成这样:

my parent

|- me

|-- ls

当 ls 命令结束后,我几乎又变回了我自己:

my parent

|- me

|-- ls(zombie)

在这时 ls 其实是一个僵尸进程。这意味着它已经死了,但它还在等我,以防我需要检查它的返回值(使用 wait 系统调用)。一旦我获得了它的返回值,我将再次恢复独自一人的状态。

my parent

|- me

fork 和 exec 的代码实现

如果你要编写一个 shell,这是你必须做的一个练习。

事实证明,有了 C 或 Python 的技能,你可以在几个小时内编写一个非常简单的 shell,像 bash 一样。(至少如果你旁边能有个人多少懂一点,如果没有的话用时会久一点。)我已经完成啦,真的很棒。

这就是 fork 和 exec 在程序中的实现。我写了一段 C 的伪代码。请记住,fork 也可能会失败哦。

intpid = fork();

// 我要分身啦

// “我”是谁呢?可能是子进程也可能是父进程

if(pid == 0){

// 我现在是子进程

// “ls” 吃掉了我脑子,然后变成一个完全不一样的进程

exec(["ls"])

}elseif(pid == -1){

// 天啊,fork 失败了,简直是灾难!

}else{

// 我是父进程耶

// 继续做一个酷酷的美男子吧

// 需要的话,我可以等待子进程结束

}

上文提到的“脑子被吃掉”是什么意思呢?

进程有很多属性:

打开的文件(包括打开的网络连接)

环境变量

信号处理程序(在程序上运行 Ctrl + C 时会发生什么?)

内存(你的“地址空间”)

寄存器

可执行文件(/proc/$pid/exe)

cgroups 和命名空间(与 Linux 容器相关)

当前的工作目录

运行程序的用户

其他我还没想到的

当你运行 execve 并让另一个程序吃掉你的脑子的时候,实际上几乎所有东西都是相同的! 你们有相同的环境变量、信号处理程序和打开的文件等等。

唯一改变的是,内存、寄存器以及正在运行的程序,这可是件大事。

为何 fork 并非那么耗费资源(写入时复制)

你可能会问:“如果我有一个使用了 2GB 内存的进程,这是否意味着每次我启动一个子进程,所有 2 GB 的内存都要被复制一次?这听起来要耗费很多资源!”

事实上,Linux 为 fork() 调用实现了写时复制copy on write,对于新进程的 2GB 内存来说,就像是“看看旧的进程就好了,是一样的!”。然后,当如果任一进程试图写入内存,此时系统才真正地复制一个内存的副本给该进程。如果两个进程的内存是相同的,就不需要复制了。

为什么你需要知道这么多

你可能会说,好吧,这些细节听起来很厉害,但为什么这么重要?关于信号处理程序或环境变量的细节会被继承吗?这对我的日常编程有什么实际影响呢?

有可能哦!比如说,在 Kamal 的博客上有一个很有意思的 bug。它讨论了 Python 如何使信号处理程序忽略了 SIGPIPE。也就是说,如果你从 Python 里运行一个程序,默认情况下它会忽略 SIGPIPE!这意味着,程序从 Python 脚本和从 shell 启动的表现会有所不同。在这种情况下,它会造成一个奇怪的问题。

所以,你的程序的环境(环境变量、信号处理程序等)可能很重要,都是从父进程继承来的。知道这些,在调试时是很有用的。

换一批

延伸阅读

[真心话] 年轻人,没事别唧唧歪歪

年轻人,没事别唧唧歪歪

常听到抱怨,工资如何如何不满意,领导如何如何了,不知道当年的我是否也曾如此如祥林嫂般。......

关键字:年轻人 工作

[猎聘集] 茅台招工每天工作5小时年入13万 应聘先测长跑

茅台招工每天工作5小时年入13万 应聘先测长跑

贵州茅台股价创出485元的高价,再度刷新历史纪录,成为中国股市目前单股股价最高的上市公司。股票受追捧,进茅台上班也一样成为抢破头的工作。......

关键字:茅台 工作 应聘

[猎聘集] 未来将会出现的9种工作

未来将会出现的9种工作

随着科技史无前例的飞速发展,很难想像二十年后各行各业的工作会变成什么样子。但是加拿大奖学金计划(CST),一个致力于帮助加拿大孩子大专教育的非盈利,想要搞清楚这一点。在富有远见的战略家们的帮助下,CST预测到2030年可能会普遍存在的工作。......

关键字:工作

[猎聘集] 工作三年后,我选择离开腾讯

工作三年后,我选择离开腾讯

经过各种综合考虑后,我还是点了“确定”按钮,正式从工作了三年的腾讯离职。一直有朋友问:在腾讯的工作感觉怎么样?关于这个问题,从来没有好好思考过,觉得当局者迷,尽量做好手上工作就是了。现在终于有时间梳理一番。 回想起这几年的经历,既有取得成......

关键字:工作 腾讯 离职 大公司

[猎聘集] 在阿里,你知道的年薪百万,是这样熬出来的…

在阿里,你知道的年薪百万,是这样熬出来的…

在阿里上班,月入过万,成为众多人眼中羡慕的对象。如今的阿里,有员工4万多人,从开始建立到今天18年里,有6万多人离职,而这些人就撑起了半个中国的互联网,阿里给员工提供的薪酬和福利都是相当不错的,这其中还包括股票和期权,但是,即使这样,还是阻......

关键字:阿里巴巴 工作

[猎聘集] 十年后47%工作岗位消失 什么人不会被淘汰

十年后47%工作岗位消失 什么人不会被淘汰

纵观数百年科技应用对就业的冲击影响主要有两点:其一,对大多数劳动者来说无疑是毁灭性的,他们需要重新调整他们的劳动技能;其二,鼓励资本进入那些生产效率更高的行业并引导新的就业趋势。在这一正一副双重影响下,凸显出一个核心问题:新技术创造的新就业......

关键字:技术 人类 工作岗位

[猎聘集] 电子开发工程师到35岁,到底该如何抉择?

电子开发工程师到35岁,到底该如何抉择?

有人说工程师是一件很艰苦的工作,年轻的时候需要花费大量的时间和精力去应付日常工作中的挑战,以及不断地学习新的知识和技能。而加班,对于中国的电子工程师来说更是家常便饭。......

关键字:电子工程师 高强度工作

[新鲜事] 摄影师要下岗了?机器人摄像系统可以替代整个时尚摄影工作室

摄影师要下岗了?机器人摄像系统可以替代整个时尚摄影工作室

荷兰公司StyleShoots宣布推出全新得Live智能工作室,包括一个高端的佳能1DX Mk II相机,可拍摄4K视频和2000万像素的静止照片,还包括一个三轴设置平台,可以自动配置照明,拍摄视频和照片,并支持存储为所有格式的照片。......

关键字:智能工作室 摄像 机器人
条评论

我 要 评 论

网友评论

大家都爱看

  • 扇出型晶圆级封装的优势和挑战!

    我们有能力创造一些能保持前代性能并且更好更小的电子设备,例如今天的可穿戴设备、智能手机或平板电脑,这是由于很多因素超过摩尔定律而快速发展,从而能够从底层的嵌入组件发展到今天把它们封…

    2018-03-29
  • Xilinx推出革命性的新型自适应计算产品

    自适应和智能计算的全球领先企业赛灵思公司(Xilinx, Inc.,(NASDAQ:XLNX)),近日宣布推出一款超越FPGA功能的突破性新型产品,名为ACAP(Adaptive Compute Acceleration Platform,自适应计算加速…

    2018-03-20
  • 赛普拉斯为树莓派3 B+ IoT单板计算机提供强大稳定的无

    先进嵌入式系统解决方案的领导者赛普拉斯(纳斯达克代码:CY)近日宣布其Wi-Fi®和蓝牙®combo解决方案为全新的树莓派 3 B+(Raspberry Pi 3Model B+)IoT单板计算机提供强大稳定的无线连接…

    2018-03-20
  • 观看直播领红包,SEED-A10加速卡助力人工智能

    随着云服务器、云计算的发展,大家对硬件加速的需求越来越多,但是随着设备功耗的上升、性能需求越来越高,常规加速设备以及开始不能满足需求,因此FPGA逐渐在硬件加速中找到了自己的位置,而艾…

    2018-03-19
  • 特朗普:博通不得以任何形式收购高通

    白宫周一(3月12日)晚发出声明,川普(特朗普)总统出于“国家安全”考量、禁止新加坡博通公司(Broadcom)收购美国高通公司(Qualcomm)。

    2018-03-14