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

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

61b7b9643fc7e39d453a893ff90076d0.jpg-wh_651x-s_2615727700.jpg

本文是关于 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。

开端是如许的:myparent

|-me

|--cloneof memyparent

|-me

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

|-me

|--ls

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

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

fork 和 execmyparent

|-me

|--ls(zombie)

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

|-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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值