【问题标题】:child process changing memory image子进程改变内存图像
【发布时间】:2020-04-18 14:07:36
【问题描述】:

我正在阅读有关流程的内容,我发现了这个:

通常,子进程随后会执行 execve 或类似的系统调用来更改其内存映像

我可以从中得出这个伪代码:

if(child_created_sucessfully)
{
    do_ABC_and_ignore_the_part_of_the_parent's_control_flow   //is this what it meant to "change its memory image"?
}

(伪代码评论中提出的问题)

我完全不明白这部分:

例如,当用户向 shell 键入命令(例如,sort)时, shell forks 关闭子进程,子进程执行排序。这两个步骤的原因 进程是允许子进程在fork之后操作它的文件描述符,但是 在execve之前为了完成标准输入的重定向,标准 输出和标准错误。

【问题讨论】:

    标签: c unix process operating-system


    【解决方案1】:

    关于第一部分

    通常,子进程然后执行 execve 或类似的系统 调用来改变它的内存映像

    这仅仅意味着当您创建一个子进程时,它会初始化它自己的堆栈和堆内存,尽管这不是 100% 正确的。由于新进程在进程开始运行时的时间 T 在时间 T + 1 时分叉,因此它在内存中的数据方面几乎相同,因此有一个称为“写入时复制”的智能优化更多here .

    关于第二部分

    例如,当用户向 shell 键入命令(例如 sort)时, shell 分叉出一个子进程,子进程执行排序。这 这个两步过程的原因是允许孩子操纵 它的文件描述符在 fork 之后但在 execve 之前,以便 完成标准输入、标准输出的重定向 标准错误。

    简单地说,这意味着当您执行 shell 命令(如 ls、ps、grep、nstat...)时,操作系统会分叉执行命令的当前进程,而命令本身由这个新进程执行。理解这一点的一个简单方法是使用ps | grep ps 这将首先分叉并创建一个新进程,然后这部分开始发挥作用

    这两个步骤的过程是允许孩子操作其文件 在 fork 之后但在 execve 之前的描述符

    并且进程的标准输出被改变。在新的ps 进程执行ps 之后,它将为grep ps 创建另一个进程,该进程将执行grep,您应该能够看到创建此@987654329 的ps 进程@进程。

    【讨论】:

    • the OS forks the current process which executes the command - 当前进程是shell?
    • @infinite 是的。我建议您阅读有关操作系统或有关此主题的恐龙书,这里有详细的解释medium.com/meatandmachines/…
    猜你喜欢
    • 2020-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-15
    • 1970-01-01
    • 2011-04-08
    • 2020-04-30
    • 2014-10-14
    相关资源
    最近更新 更多