Когда я набираю find
в unix оболочку, создается ли новый процесс (для обработки операции поиска) или нет? И почему?
4 ответа
да, вообще говоря, find
не является встроенной командой, поэтому оболочка создаст новый процесс, вызвав fork()
который выполнит команду exec()
.
Возможно (возможно), но не обязательно. Если вы ранее набрали:
$ find() { :; }
тогда при вводе команды find
создается новый процесс. Вместо этого оболочка вызовет функцию, которая не работает. Однако, если вы не определили такую функцию, у вас нет псевдонима для find
, и в вашем find
существует исполняемый файл с именем PATH
, то оболочка (почти наверняка) разветвляет новый процесс. ("Почти наверняка", потому что вполне возможно, что вы используете оболочку, которая реализует find
как встроенную, хотя я не знаю ни одной оболочки, которая это делает.)
все внешние команды создают процесс (т.е. использует fork ()).Ex.find, grep, cp, mv и т.д. Только внутренние команды не использовали fork ()(например, cd, pwd и т.д.).Даже в некоторых известных книгах внутренние команды определены как команды, которые не генерируют никаких процессов.
Вы также спросили, почему создается новый процесс.
Запуск программы в Unix предполагает замену образа памяти текущего процесса на образ программы; это делается семейством системных вызовов exec()
. Когда программа заканчивается, процесс завершается. Если бы мы не разветвляли новый процесс, больше не было бы процесса оболочки, запускающего отображение нового приглашения и позволяющего запускать больше команд.
Таким образом, оболочка разветвляет дочерний процесс, и этот дочерний процесс исполняет программу. Между тем исходный процесс оболочки ожидает завершения этого процесса. Или, если вы заканчиваете команду с помощью &
, оболочка не ждет - это то, как мы запускаем программы в фоновом режиме (я сильно упрощаю, но это важная суть).