年前最后一场技巧盛宴 | 1月27日与京东、日记易技巧大年夜咖畅聊智能化运维成长趋势!
本文是关于 fork 和 exec 是如安在 Unix 上工作的。你或许已经知道,也有人还不知道。几年前当我懂得到这些时,我赞叹不已。
我们要做的是启动一个过程。我们已经在博客上评论辩论了很多关于体系调用的问题,每当你启动一个过程或者打开一个文件,这都是一个体系调用。所以你可能会认为有如许的体系调用:
start_process(["ls", "-l", "my_cool_directory"])
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
|-- clone of me
my parent
|- me
然后我让该子过程运行 exec("ls")
,变成如许:
my parent
|- me
|-- ls
当 ls 敕令停止后,我几乎又变回了我本身:
这是一个合理的设法主意,显然这是它在 DOS 或 Windows 中的工作道理。我想说的是,这并不是 Linux 上的工作道理。然则,我查阅了文档,确切有一个 posix_spawn 的体系调用根本上是如许做的,不过这不在本文的评论辩论范围内。
fork 和 exec
my parent
|- me
|-- ls (zombie)
在这时 ls
其实是一个僵尸过程。这意味着它已经逝世了,但它还在等我,以防我须要检查它的返回值(应用 wait
体系调用)。一旦我获得了它的返回值,我将再次恢复独自一人的状况。
my parent
|- me
fork 和 exec 的代码实现
如不雅你要编写一个 shell,这是你必须做的一个演习(这是一个异常有趣和有启发性的项目。Kamal 在 Github 上有一个很棒的研究会:https://github.com/kamalmarhubi/shell-workshop)。
推荐阅读
年前最后一场技巧盛宴 | 1月27日与京东、日记易技巧大年夜咖畅聊智能化运维成长趋势!而客户端只是一个与办事端交互的对象,如sqlplus,在sqlplus里履行SQL语句传到办事端,办事端进行解析后履行SQL里的>>>详细阅读
地址:http://www.17bianji.com/lsqh/40389.html
1/2 1