дочерний процесс изменяет образ памяти

Я читал о процессах и наткнулся на это:

Обычно дочерний процесс затем выполняет 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"?
}

(Вопрос задан в комментарии к псевдокоду)

Я совершенно не понимаю эту другую часть:

Например, когда пользователь вводит команду, скажем, sort, в оболочку, оболочка fork отключается от дочернего процесса, и дочерний процесс выполняет сортировку. Причина этого двухэтапного процесса состоит в том, чтобы позволить потомку манипулировать своими файловыми дескрипторами после fork, но перед execve, чтобы выполнить перенаправление стандартного ввода, стандартного вывода и стандартной ошибки.


person infinite    schedule 29.12.2019    source источник


Ответы (1)


По поводу первой части

Обычно дочерний процесс затем выполняет execve или аналогичный системный вызов для изменения своего образа памяти.

Это просто означает, что когда вы создаете дочерний процесс, он инициализирует свой собственный стек и память кучи, хотя это не на 100% верно. Поскольку новый процесс разветвляется в момент времени T в момент времени T + 1, когда процесс начинает выполняться, он почти идентичен, когда речь идет о данных в памяти, поэтому существует умная оптимизация, называемая «копирование при записи». ="https://stackoverflow.com/questions/628938/what-is-copy-on-write">здесь.

По поводу второй части

Например, когда пользователь вводит команду, скажем, sort, в оболочку, оболочка отделяет дочерний процесс, и дочерний процесс выполняет sort. Причина этого двухэтапного процесса состоит в том, чтобы позволить потомку манипулировать своими файловыми дескрипторами после fork, но перед execve, чтобы выполнить перенаправление стандартного ввода, стандартного вывода и стандартной ошибки.

Проще говоря, это означает, что когда вы выполняете команду оболочки (например, ls, ps, grep, nstat...), ОС разветвляет текущий процесс, который выполняет команду, и сама команда выполняется этим новым процессом. Простой способ понять это - использовать ps | grep ps, который сначала разветвится и создаст новый процесс, а затем вступит в игру эта часть.

этот двухэтапный процесс позволяет дочернему процессу манипулировать своими файловыми дескрипторами после разветвления, но до выполнения.

и стандартный вывод процесса изменен. После того, как новый процесс ps выполнит ps, он разветвится и создаст еще один процесс для grep ps, который будет выполнять grep, и вы сможете увидеть процесс ps, создавший этот процесс grep.

person Ivan Kaloyanov    schedule 29.12.2019
comment
the OS forks the current process which executes the command - текущий процесс является оболочкой? - person infinite; 29.12.2019
comment
@бесконечно да. Я предлагаю вам книгу динозавров об ОС или по этой теме, здесь есть подробное объяснение medium.com/meatandmachines/ - person Ivan Kaloyanov; 29.12.2019