Do * Unix shells вызывают функцию pipe (), когда сталкиваются с символом & ldquo; pipe & rdquo ;? [Дубликат]

3
задан Neo 11 November 2014 в 22:38
поделиться

2 ответа

Да, оболочка должна fork выполнять каждый подпроцесс. Помните, что когда вы вызываете одно из семейств функций execve(), он заменяет текущий образ процесса с помощью exec'ed. Ваша оболочка не может продолжать обрабатывать дальнейшие команды, если она непосредственно выполняет подпроцесс, потому что после этого она больше не существует (кроме как подпроцесс).

Чтобы исправить это, просто fork() снова в ветви pid == 0 , и выполните команду ls в этом дочернем элементе. Помните wait() для обоих (всех) дочерних процессов, если вы не хотите, чтобы конвейер выполнялся асинхронно.

1
ответ дан John Bollinger 24 August 2018 в 00:35
поделиться

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

0
ответ дан Joni 24 August 2018 в 00:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: