почему асимметричное поведение в трубах - PullRequest
2 голосов
/ 07 июня 2009

почему считыватель может существовать, когда нет писателей, но не разрешает писателю существовать, когда в каналах нет читателей?

. Это потому, что читатель должен ждать, так что все в порядке, если писателя нет, а писатель готов к данным, и неизвестно, сколько времени ему нужно ждать, даже если он готов к данным.

. Это потому, что файловый дескриптор автора может быть неправильно использован читателями (мне не ясно, как)

Ответы [ 3 ]

5 голосов
/ 07 июня 2009

Вы должны говорить о какой-то конкретной реализации каналов.

[Proc 1]
$ mkfifo /tmp/mypipe
$ echo "No Boom Here" > /tmp/mypipe
<process blocks>

[Proc 2, later]

$ cat /tmp/mypipe
No Boom Here

Итак, он отлично работает в Unix-системах, вы можете читать или писать канал без читателей или писателей. Однако ваш процесс будет блокироваться, пока компаньон не подключится.

Возможно, это вещь для Windows?

Кроме того, путь Unix - это правильное поведение, ИМХО. Это должно просто заблокировать в любом случае.

1 голос
/ 07 июня 2009

Это потому, что условие ошибки вызывается выводом. Так что читатель без писателей просто сидит и ничего не беспокоит, потому что нет выхода, который пытается пойти куда-то и не может. Писатель без читателей пытается отправить свой вывод, не может, и ошибки.

0 голосов
/ 07 июня 2009

В случае считывателя, он немедленно заблокирует (спит), потому что нечего читать. Если писатель начинает, читатель продолжает спать, и никакого вреда не причинено.

Для писателя это будет заполнять буферы и блокировать. Если бы читатель не появился, это было бы пустой тратой системных ресурсов.

К вашему сведению, приведенное выше обоснованное предположение.

...