Гонки при передаче по каналу двух команд к именованному каналу

zsh может сделать это внутренне. Поместите это в Ваш .zshrc:

zstyle ':completion:*' list-prompt   ''
zstyle ':completion:*' select-prompt ''

прежде

autoload -Uz compinit
compinit

(уже добавьте последние строки если не существующий),

См. zsh документацию для деталей.

5
24.03.2013, 10:03
4 ответа

Почему не просто сделайте:

{ echo foo; echo bar;} > /tmp/p

Если Вы хотите, чтобы Ваш сценарий управления оставил канал открытым, можно сделать:

exec 3<> /tmp/p

Открытие именованного канала в режиме чтения-записи должно избежать, что, чтобы заблокироваться, если канал еще не был открыт. Это инстанцировало бы его, если бы это еще не было. Это работает над Linux, по крайней мере, но не гарантируется POSIX.

Кроме того (и портативно):

: < /tmp/p & exec 3> /tmp/p

Затем вместо того, чтобы иметь каждый процесс открывают именованный канал, можно также сделать:

cmd >&3

И в конце, Вы сделали бы:

exec 3>&-

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

измените все <s к >s и <s к >s, если Вам нужна логика, чтобы быть наоборот.

6
27.01.2020, 20:37

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

2
27.01.2020, 20:37
  • 1
    Это не имеет никакого отношения cat здесь и Ваш pcat может быть записан cat p 3> p и никогда не возвращался бы. –  Stéphane Chazelas 24.03.2013, 18:19

Вы просто неправильно понимаете, как кошка работает. Выход эха заставляет кошку выйти, также. Таким образом, если Вы не можете вынудить свои записи открыть канал rw (и сохранить его открытым) затем, просто необходимо назвать кошку в цикле:

while true; do cat /tmp/p || break; done

повреждение становится активным при отмене кошки с, например, ^C.

0
27.01.2020, 20:37
  • 1
    я понимаю это; проблема, которую я имею, - то, что кошка видит EOF на канале во-первых. Я должен управлять поведением так, чтобы я мог перенаправить вывод процессов N к концу записи канала, прежде чем это закрылось (т.е. прежде чем читатель, у этой кошки случай, будет видеть EOF). –  Cera 24.03.2013, 22:06

Можно вручную держать открытой псевдозаписывающую ссылку на fifo (используя tail -f /dev/null 1>fifo или cat fifo 3>fifo), чтобы читающий конец fifo не закрылся после первого чтения.

# tty1
bash -c '
mkfifo fifo || exit 1
tail -f /dev/null 1>fifo &
#0<&- cat fifo 3>fifo &
#lsof -p $!
echo first > fifo
echo second > fifo
kill $!
'

# tty2
cat fifo
0
27.01.2020, 20:37

Теги

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