именованные каналы, видимо, не работают / не отвечают?

273
jov14

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

везде, где я ищу информацию, я получаю в основном один и тот же смысл: именованные каналы должны быть очень просты в использовании.

Суть в основном в том, что должно работать следующее:

mkfifo mynamedpipe echo "is this working?" > mynamedpipe cat mynamedpipe

когда я бегу mkfifo mynamedpipe, труба успешно создана и видна с ls *.

Но даже после того, как я даю себе разрешение на запись в этот канал, при попытке запустить echo "whatever" > mynamedpipeничего не происходит, и терминал просто зависает, пока я не завершу процесс с помощью ctrl+c.

У меня есть эта проблема на моей локальной машине с Linux (Ubuntu 14.04.5 LTS), а также на общедоступном сервере (Red Hat Enterprise Linux 7) и в zsh, а также в bash.

Что я здесь не так делаю?

1
попробуйте `кошка <mynamepipe`. также обратите внимание на эту цитату из https://www.linuxjournal.com/article/2156: «Если вы внимательно посмотрите, вы заметите, что первая команда, которую вы запускаете, кажется, зависает. Это происходит потому, что другой конец канала не еще не подключен, и поэтому ядро ​​приостанавливает первый процесс до тех пор, пока второй процесс не откроет канал. В Unix jargon процесс называется «заблокированным», так как он ожидает, что что-то произойдет ». Frank Thomas 6 лет назад 1
Спасибо, что проясняю вещи для меня. Но досадно, что практически каждый учебник по этому вопросу (или, по крайней мере, все наиболее известные хиты Google) точно описывают основные шаги, которые я опубликовал выше, заявляя, что они должны работать «как есть», никогда не обращаясь к этой проблеме. Это то, что изменилось в последнее время? jov14 6 лет назад 0
Вы должны использовать ридер (`cat mynamedpipe`) ** сначала **. Это означает, что вам нужно два терминала. Кроме того, это пахнет как [вопрос XY] (https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). Пожалуйста, объясните реальную проблему, которую вы пытаетесь решить: что это за «конвейеры, которые, к сожалению, не принимают данные непосредственно от stdin»? dirkt 6 лет назад 0

1 ответ на вопрос

1
harrymc

Этот пост, похоже, относится к вашей проблеме: Cat to named pipe приводит к зависанию .

Соответствующие замечания:

  • Вам нужно что-то читать из ФИФО
  • Убедитесь, что канал создан с достаточно большим буфером или считыватели достаточно быстрые, чтобы избежать блокировки
  • Вам необходимо назначить канал дескриптору файла, как в:

    exec 3<>/tmp/stream_pipe 
Спасибо за информацию. К сожалению, это означает, что именованные каналы не являются для меня альтернативой, так как на этом плакате также говорится, что попытка изменить размер буфера для него ничего не изменила. Я искал альтернативу подключению с помощью нижестоящих инструментов, которые не читают из stdin, поэтому канал не обязательно используется во время записи. Имеет смысл, чтобы трубы вели себя таким образом. Итак, вернемся к записи и чтению промежуточных физических временных файлов для меня ... jov14 6 лет назад 0
Именованные каналы хороши, но, к сожалению, не являются решением для потенциально очень больших данных. harrymc 6 лет назад 0

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