Вы пропустили звонок на fork
. Все, что exec
делает, это заменяет текущий образ процесса на новый программы. Используйте fork
, чтобы создать копию вашего текущего процесса. Его возвращаемое значение скажет вам, работает ли это дочерний элемент или исходный родительский элемент. Если это ребенок, звоните exec
.
После того, как вы внесли это изменение, появляется только , которое необходимо нажать Enter для завершения программы. На самом деле происходит следующее: родительский процесс разветвляется и выполняет дочерний процесс. Оба процесса выполняются, и оба процесса печатают в стандартный вывод одновременно. Их вывод искажен. Родительский процесс имеет меньше действий, чем дочерний, поэтому он завершается первым. Когда он завершается, ваша оболочка, которая его ждала, просыпается и печатает обычную подсказку. Между тем, дочерний процесс все еще выполняется. Он печатает больше записей файла. Наконец, это заканчивается. Оболочка не обращает внимания на дочерний процесс (его внука), поэтому у оболочки нет причин повторно печатать подсказку. Посмотрите внимательнее на вывод, который вы получаете, и вы сможете найти свою обычную командную строку, скрытую в выводе ls
выше.
Появится курсор , ожидающий нажатия клавиши. Когда вы это сделаете, оболочка напечатает подсказку, и все выглядит нормально. Но что касается снаряда, все уже было нормально. Вы могли набрать другую команду раньше. Это выглядело бы немного странно, но оболочка выполнила бы это нормально, потому что она получает ввод только с клавиатуры, а не от дочернего процесса, печатающего дополнительные символы на экране.
Если вы используете программу, подобную top
, в отдельном окне консоли, вы можете посмотреть и подтвердить, что обе программы уже закончили работать, прежде чем нажимать Enter.