Системный вызов exec
заменяет текущий процесс выполняемой вами программой.Таким образом, ваш процесс, естественно, перестает работать после turtle_execute
, поскольку он был заменен новым процессом.
Чтобы выполнить новый процесс, вы обычно создаете копию текущего процесса, а затем выполняете его в копии.
Когда вы находитесь в оболочке, обычно каждая введенная вами команда разветвляется и выполняется.Попробуйте набрать exec
, а затем ввести команду в оболочку, и вы увидите, что оболочка завершает работу после завершения выполнения этой команды, поскольку в этом случае она не развивается.
Редактировать
IПредлагаем вам взглянуть на пример на странице руководства pipe (2) (http://man7.org/linux/man-pages/man2/pipe.2.html#EXAMPLE).. Здесь показан обычный способ использования канала:
- Вызов
pipe
для получения команды createтруба - Вызывающая вилка для разветвления процесса
- В зависимости от того, является ли это дочерним или родительским объектом, закройте один конец трубы и используйте другой
Я думаю, что вашпроблема может заключаться в том, что вы делаете конец записи своего канала stdout перед разветвлением, в результате чего родительский и дочерний элементы имеют открытый конец записи. Это может помешать отправке EOF, поскольку один конец записи все еще открыт.
Я могу только догадываться, что происходит в большей части turtle_execute, но если вы выполняете разветвление, выполняете на одном процессе и ждете его на другом, не потребляя данные из канала, это может заполнить канал и поток данных.Int, где запись заблокирована.Вы должны всегда потреблять данные из канала, пока вы пишете в него.В конце концов, это труба, а не резервуар для воды.Для получения дополнительной информации загляните на справочную страницу pipe (7) в разделе «Емкость трубы».