Как сделать трубу в с ++ - PullRequest
5 голосов
/ 30 апреля 2011

Я смотрю на код для программы на С ++, которая передает содержимое файла больше.Я не совсем понимаю, поэтому мне было интересно, может ли кто-нибудь написать псевдокод для программы на C ++, которая передает что-то другому?Почему нужно использовать fork?

Ответы [ 3 ]

6 голосов
/ 30 апреля 2011
create pipe
fork process
if child:
  connect pipe to stdin
  exec more
write to pipe

Вам необходимо fork(), чтобы вы могли заменить stdin дочернего элемента перед вызовом и чтобы вы не ждали процесса, прежде чем продолжить.

2 голосов
/ 20 мая 2013

Почему необходимо использовать fork?

Когда вы запускаете конвейер из оболочки, например,

$ ls | more

что происходит?Оболочка запускает два процесса (один для ls, один для more).Кроме того, выход (STDOUT) ls соединен с входом (STDIN) more трубой.

Обратите внимание, что ls и more не нужно ничего знатьо каналах они просто пишут (и читают) их STDOUT (и STDIN) соответственно.Кроме того, поскольку они могут выполнять обычные блокировки операций чтения и записи, важно, чтобы они могли работать одновременно.В противном случае ls может просто заполнить буфер канала и навсегда заблокировать, прежде чем more получит шанс что-либо потребить.

... передает что-то другому ...

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


В общем, вы может использовать канал без fork, но вы просто будете общаться в своем собственном процессе.Это означает, что вы либо выполняете неблокирующие операции (возможно, в синхронной совместной подпрограмме), либо используете несколько потоков.

2 голосов
/ 30 апреля 2011

Вы найдете ответ точно здесь

...