Итак, я использовал fork ()
, и я знаю, что он делает. Я как новичок очень этого боялся (и до сих пор не понимаю полностью). Общее описание fork ()
, которое вы можете найти в Интернете, заключается в том, что он копирует текущий процесс и назначает другой PID, родительский PID и процесс будет иметь другое адресное пространство.Однако все хорошо, учитывая это описание функциональности, новичок может задаться вопросом: «Почему эта функция так важна ... зачем мне копировать свой процесс?». Так что я задался вопросом и в конце концов выяснил, как можно вызывать другие процессы из текущего процесса с помощью семейства execve ()
.
Я до сих пор не понимаю, почему вы должны делать это именно так? Самым логичным было бы иметь функцию, которую вы можете вызывать, например
create_process("executable_path+name",params..., more params);
, которая порождает новый процесс и запускает его в начале main () и возвращает новый PID.
Меня беспокоит ощущение, что решение fork / execve выполняет потенциально ненужную работу. Что, если мой процесс использует тонны памяти? Копирует ли ядро мои таблицы страниц и тому подобное. Я уверен, что он действительно не выделяет реальную память, если я не коснулся ее. Кроме того, что произойдет, если у меня есть потоки? Мне просто кажется, что это слишком грязно.
Почти все описания того, что делает fork, говорят, что он просто копирует процесс, и новый процесс запускается после вызова fork ()
. Это действительно то, что происходит, но почему это происходит именно так и почему fork / execve - единственный способ порождать новые процессы, и каков наиболее общий способ unix для создания нового процесса из вашего текущего? Есть ли другой более эффективный способ вызвать процесс? **, который не потребовал бы копирования дополнительной памяти.
В этой ветке обсуждается та же проблема, но я нашел ее не совсем удовлетворительной:
Спасибо.