Хорошо, давайте представим, что вы запустили эту вещь из терминала.Тогда у вас есть:
file 0 (stdin) = terminal keyboard
file 1 (stdout) = terminal screen
file 2 (stderr) = terminal screen
Теперь вы запускаете pipe(fd)
, и у вас есть:
file 0-2 = as before
file 3 (fd[0]) = read end of pipe 1
file 4 (fd[1]) = write end of pipe 1
Теперь вы запускаете первые два dup2
s и первые два close
s:
file 0 = read end of pipe 1
file 1 = write end of pipe 1
file 2 = still terminal screen
file 3-4 = now closed
Теперь вы создаете новый pipe
:
file 0-2 as before
file 3 (fd[0]) = read end of pipe 2
file 4 (fd[1]) = write end of pipe 2
И теперь вы форк.В дочернем процессе вы вызываете dup2(fd[1],1)
и закрываете оба fd
s (ваш источник здесь не совсем прав):
file 0: read end of pipe 1
file 1: write end of pipe 2
file 2: terminal screen
file 3-4: closed
В родительском процессе вы вызываете dup2(fd[0],0)
и снова закрываете обаfd
s дает его:
file 0: read end of pipe 2
file 1: write end of pipe 1
file 2: terminal screen
file 3-4: closed
Итак, у нас есть родительский процесс, записывающий свой стандартный вывод в канал 1, из которого дочерний процесс читает свой стандартный вывод.Точно так же у нас есть родительский процесс, считывающий свой стандартный вывод из канала 2, в который дочерний процесс записывает свой стандартный вывод.То есть, кольцо двух процессов.
Меня всегда учили, что такого рода договоренности склонны к тупику.Я не знаю, так ли это с более современными Unix, но стоит упомянуть.