Как сделать трубу в с ++

Я смотрю на код для программы на 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, но вы просто будете общаться в своем собственном процессе. Это означает, что вы либо выполняете неблокирующие операции (возможно, в синхронной совместной подпрограмме), либо используете несколько потоков.

Другие вопросы по тегам