2

Когда я набираю find в unix оболочку, создается ли новый процесс (для обработки операции поиска) или нет? И почему?

4 ответа4

4

да, вообще говоря, find не является встроенной командой, поэтому оболочка создаст новый процесс, вызвав fork() который выполнит команду exec() .

2

Возможно (возможно), но не обязательно. Если вы ранее набрали:

$ find() { :; }

тогда при вводе команды find создается новый процесс. Вместо этого оболочка вызовет функцию, которая не работает. Однако, если вы не определили такую функцию, у вас нет псевдонима для find , и в вашем find существует исполняемый файл с именем PATH , то оболочка (почти наверняка) разветвляет новый процесс. ("Почти наверняка", потому что вполне возможно, что вы используете оболочку, которая реализует find как встроенную, хотя я не знаю ни одной оболочки, которая это делает.)

2

все внешние команды создают процесс (т.е. использует fork ()).Ex.find, grep, cp, mv и т.д. Только внутренние команды не использовали fork ()(например, cd, pwd и т.д.).Даже в некоторых известных книгах внутренние команды определены как команды, которые не генерируют никаких процессов.

1

Вы также спросили, почему создается новый процесс.

Запуск программы в Unix предполагает замену образа памяти текущего процесса на образ программы; это делается семейством системных вызовов exec() . Когда программа заканчивается, процесс завершается. Если бы мы не разветвляли новый процесс, больше не было бы процесса оболочки, запускающего отображение нового приглашения и позволяющего запускать больше команд.

Таким образом, оболочка разветвляет дочерний процесс, и этот дочерний процесс исполняет программу. Между тем исходный процесс оболочки ожидает завершения этого процесса. Или, если вы заканчиваете команду с помощью & , оболочка не ждет - это то, как мы запускаем программы в фоновом режиме (я сильно упрощаю, но это важная суть).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .