Как сделать трубу в с ++
Я смотрю на код для программы на C++, которая передает содержимое файла больше. Я не совсем понимаю, поэтому мне было интересно, может ли кто-нибудь написать псевдокод для программы на C++, которая передает что-то другому? Почему необходимо использовать fork?
3 ответа
create pipe
fork process
if child:
connect pipe to stdin
exec more
write to pipe
Тебе нужно fork()
чтобы вы могли заменить stdin дочернего элемента перед вызовом, и чтобы вы не ждали процесса, прежде чем продолжить.
Почему необходимо использовать fork?
Когда вы запускаете конвейер из оболочки, например.
$ ls | more
что просходит? Оболочка запускает два процесса (один для ls
один для more
). Кроме того, выход (STDOUT) из ls
подключен к входу (STDIN) more
, по трубе.
Обратите внимание, что ls
а также more
не нужно ничего знать о каналах, они просто пишут (и читают из) их STDOUT (и STDIN) соответственно. Кроме того, поскольку они могут выполнять обычные блокирующие чтения и записи, важно, чтобы они могли работать одновременно. Иначе ls
может просто заполнить буфер трубы и заблокировать навсегда, прежде чем more
получает шанс что-нибудь съесть.
... трубы что-то другое...
Также обратите внимание, что помимо аргумента параллелизма, если ваша другая вещь - другая программа (например, more
), он должен работать в другом процессе. Вы создаете этот процесс, используя fork
, Если вы просто бежите more
в текущем процессе (используя exec
), это заменит вашу программу.
В общем, вы можете использовать трубу без fork
, но вы просто будете общаться в своем собственном процессе. Это означает, что вы либо выполняете неблокирующие операции (возможно, в синхронной совместной подпрограмме), либо используете несколько потоков.