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