В настоящее время я читаю Стивенс / Раго: «Расширенное программирование в среде Unix».
В разделе книги о группах процессов автор обсуждает, как группы процессов обычно используются оболочками для конвейеризации.
Например, приведенный ниже аргумент мог быть сгенерирован командами оболочки вида:
proc1 |proc2 & proc3 |proc4 |proc5
Множество других ресурсов также обсуждают отношения между группами процессов и конвейерной обработкой.Тем не менее, единственное, что я не могу найти, - это объяснение того, как реализована эта конвейерная часть.
Я знаю, что в оболочках posix / unix, таких как оболочка Boune-again (BASH), процессы в конвейеревыполняется параллельно - то есть в предыдущем примере, показывающем proc3 | proc4 | proc5
, все эти три процесса выполняются одновременно.Стандарт proc4 подключен к стандарту proc3.(Я также знаю, что MS-DOS использовал временные файлы и не выполнял конвейеры параллельно, но давайте пока проигнорируем это).
Итак, у меня proc3, proc4, proc5 все в группе процессов,Фантастика.Как это на самом деле помогает в создании конвейеров между ними?
Насколько я могу судить, мне нужно сделать следующее, чтобы включить конвейеризацию в создаваемой мной оболочке:
- Создайте N-1 конвейеров, где N - это число процессов в конвейерном операторе fork () процесса оболочки N раз
- В каждом разветвленном процессе мне нужно использовать dup2 для правильной настройки общих конвейеров
- Затем, после того, как все разветвленные процессы получили подтверждение того, что все они завершили настройку своих каналов (вероятно, через некоторый IPC через общее пространство памяти), каждый из них может затем запустить exec () и фактически запустить свои соответствующие процессы.
Однако все тексты, которые я продолжаю читать, действуют так, как будто группы процессов предоставляют некоторые магические функции для создания этих конвейеров - или они просто пренебрегают упоминанием процедуры, которую я изложил выше.
Любые комментарии или советы всегда приветствуются.