Я прочитал подобную историю из GeNUA. Их обходное решение должно было перезапустить сетевой драйвер (OpenBSD). На Linux это перевело бы в: ifdown eth3 && rmmod bnx2 && modprobe bnx2 && ifup eth3
.
Базовой проблемой была внутренняя проблема кодирования с указателями в системе PAE в сочетании с broadcom-драйвером.
Что касается причины, использовать strace
.
tail -f | strace bash >> foo
Второе echo echo hello > pToB
дает мне затем это:
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
read(0, "e", 1) = 1
read(0, "c", 1) = 1
read(0, "h", 1) = 1
read(0, "o", 1) = 1
read(0, " ", 1) = 1
read(0, "h", 1) = 1
read(0, "e", 1) = 1
read(0, "l", 1) = 1
read(0, "l", 1) = 1
read(0, "o", 1) = 1
read(0, "\n", 1) = 1
write(1, "hello\n", 6) = -1 EPIPE (Broken pipe)
--- SIGPIPE {si_signo=SIGPIPE, si_code=SI_USER, si_pid=3299, si_uid=1000} ---
+++ killed by SIGPIPE +++
Так, во второй раз, когда это пытается записать hello\n, это получает поврежденную ошибку канала; вот почему Вы не можете читать привет (это никогда не писалось), и выходы удара, таким образом, это - конец его.
Необходимо было бы использовать что-то, что сохраняет канал открытым, я предполагаю.
Как насчет этого?
(while read myline; do echo $myline; done) < pToP
Для большей справочной информации, man 7 pipe
может быть релевантным, это описывает различные ошибочные случаи вокруг каналов.
Как приложение к ответу frostschutz, рассмотрите следующую таблицу
В первый раз, когда мы пытаемся отправить привет в bToP, он заблокирован, пока нет также читатель для FIFO. Во второй раз мы, читатель передает обратно сигнал SIGPIPE, который завершает удар. Даже если бы мы могли бы проигнорировать, что, вероятно, столкнулись бы с ошибкой EPIPE после этого.
Я думаю, что я пытаюсь сделать, невозможно. Мое приложение не может "читать и записать одновременно". Я думаю, что должен буду сделать промежуточную программу способной к хранению обеих сторон канала открытый.