作家
登录

当你在Linux上启动一个进程时会发生什么?

作者: 来源: 2018-01-19 15:13:04 阅读 我要评论

年前最后一场技巧盛宴 | 1月27日与京东、日记易技巧大年夜咖畅聊智能化运维成长趋势!



当你在Linux上启动一个过程时会产生什么?

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

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

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

Linux 上的 posix_spawn 是经由过程两个体系调用实现的,分别是 forkexec(实际上是 execve),这些都是人们经常应用的。尽管在 OS X 上,人们应用 posix_spawn,而 forkexec 是不倡导的,但我们将评论辩论的是 Linux。

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

所以,假设我要启动一个名为 ls 的过程来列出一个目次。我是不是只要提议一个过程 ls 就好了呢?不是的。

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

开端是如许的:

  1. my parent
  2. |- me
  3. |-- clone of me
  1. my parent
  2. |- me

然后我让该子过程运行 exec("ls"),变成如许:

  1. my parent
  2. |- me
  3. |-- ls

当 ls 敕令停止后,我几乎又变回了我本身:

这是一个合理的设法主意,显然这是它在 DOS 或 Windows 中的工作道理。我想说的是,这并不是 Linux 上的工作道理。然则,我查阅了文档,确切有一个 posix_spawn 的体系调用根本上是如许做的,不过这不在本文的评论辩论范围内。

fork 和 exec

  1. my parent
  2. |- me
  3. |-- ls (zombie)

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

  1. my parent
  2. |- me

fork 和 exec 的代码实现

如不雅你要编写一个 shell,这是你必须做的一个演习(这是一个异常有趣和有启发性的项目。Kamal 在 Github 上有一个很棒的研究会:https://github.com/kamalmarhubi/shell-workshop)。


  推荐阅读

  【必看】Oracle与MySQL的区别对比

年前最后一场技巧盛宴 | 1月27日与京东、日记易技巧大年夜咖畅聊智能化运维成长趋势!而客户端只是一个与办事端交互的对象,如sqlplus,在sqlplus里履行SQL语句传到办事端,办事端进行解析后履行SQL里的>>>详细阅读


本文标题:当你在Linux上启动一个进程时会发生什么?

地址:http://www.17bianji.com/lsqh/40389.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)