Проблема с каналами. Канал завершается когда сделанный читатель

Я прочитал подобную историю из GeNUA. Их обходное решение должно было перезапустить сетевой драйвер (OpenBSD). На Linux это перевело бы в: ifdown eth3 && rmmod bnx2 && modprobe bnx2 && ifup eth3.

Базовой проблемой была внутренняя проблема кодирования с указателями в системе PAE в сочетании с broadcom-драйвером.

6
23.05.2017, 15:40
2 ответа

Что касается причины, использовать 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 может быть релевантным, это описывает различные ошибочные случаи вокруг каналов.

2
27.01.2020, 20:30

Как приложение к ответу frostschutz, рассмотрите следующую таблицу

enter image description here

В первый раз, когда мы пытаемся отправить привет в bToP, он заблокирован, пока нет также читатель для FIFO. Во второй раз мы, читатель передает обратно сигнал SIGPIPE, который завершает удар. Даже если бы мы могли бы проигнорировать, что, вероятно, столкнулись бы с ошибкой EPIPE после этого.

Я думаю, что я пытаюсь сделать, невозможно. Мое приложение не может "читать и записать одновременно". Я думаю, что должен буду сделать промежуточную программу способной к хранению обеих сторон канала открытый.

1
27.01.2020, 20:30

Теги

Похожие вопросы