作家
登录

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

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

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

这就是 forkexec 在法度榜样中的实现。我写了一段 C 的伪代码。请记住,fork 也可能会掉败哦。

  1. int pid = fork();
  2. // 我要分身啦
  3. // “我”是谁呢?可能是子过程也可能是父过程
  4. if (pid == 0) {
  5. // 我如今是子过程
  6. // “ls” 吃掉落了我脑筋,然后变成一个完全不一样的过程
  7. exec(["ls"])
  8. } else if (pid == -1) {
  9. // 天啊,fork 掉败了,的确是灾害!
  10. } else {
  11. // 我是父过程耶
  12. // 持续做一个酷酷的美须眉吧
  13. // 须要的话,我可以等待子过程停止
  14. }

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

然后运行 fork(),生成一个子过程,是我(me)本身的一份克隆:

过程有很多属性:

  • 打开的文件(包含打开的收集连接)
  • 情况变量
  • 旌旗灯号处理法度榜样(在法度榜样上运行 Ctrl + C 时会产生什么?)
  • 内存(你的“地址空间”)
  • 存放器
  • 可履行文件(/proc/$pid/exe
  • cgroups 和定名空间(与 Linux 容器相干)
  • 当前的工作目次
  • 运行法度榜样的用户
  • 其他我还没想到的

当你运行 execve 并让另一个法度榜样吃掉落你的脑筋的时刻,实际上几乎所有器械都是雷同的! 你们有雷同的情况变量、旌旗灯号处理法度榜样和打开的文件等等。

独一改变的是,内存、存放器以及正在运行的法度榜样,这可是件大年夜事。

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

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

事实上,Linux 为 fork() 调用实现了写时复制copy>为什么你须要知道这么多

你可能会说,好吧,这些细节听起来很厉害,但为什么这么重要?关于旌旗灯号处理法度榜样或情况变量的细节会被持续吗?这对我的日常编程有什么实际影响呢?

有可能哦!比如说,在 Kamal 的博客上有一个很有意思的 bug。它评论辩论了 Python 若何使旌旗灯号处理法度榜样忽视了 SIGPIPE。也就是说,如不雅你大年夜 Python 里运行一个法度榜样,默认情况下它会忽视 SIGPIPE!这意味着,法度榜样大年夜 Python 脚本和大年夜 shell 启动的表示会有所不合。在这种情况下,它会造成一个奇怪的问题。

所以,你的法度榜样的情况(情况变量、旌旗灯号处理法度榜样等)可能很重要,都是大年夜父过程持续来的。知道这些,在调试时是很有效的。

【编辑推荐】

  1. 如安在Linux上让一段时光不晃荡的用户主动登出
  2. 解决Linux和Windows双启动带来的时光同步问题
  3. 在多个Linux办事器,同时履行敕令
  4. 超全的 Linux 机械的渗入渗出测试敕令备忘表
  5. Linux软件安装到指定目次办法
【义务编辑:庞桂玉 TEL:(010)68476606】

  推荐阅读

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

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


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

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

关键词: 探索发现

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

网友点评
自媒体专栏

评论

热度

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