Bash: FIFO канал - прервать чтение/запись

Модератор: Модераторы разделов

inspirra
Сообщения: 211
ОС: FreeBSD, Gentoo

Bash: FIFO канал - прервать чтение/запись

Сообщение inspirra »

Bash.
Создаю канал ввода/вывода через mkfifo.
Один процесс пишет: echo string > pipe
Другой читает: read var <pipe

Как грамотно прервать процесс, если противоположный так и не начал работать?

Например: read -t 3 var <pipe - не работает.
А например:
echo string > pipe & pid=$!
while pgrep $pid && [ $(( c++ )) -eq 3 ] ; do sleep 1 ; done ; pkill $pid

как-то сильно громоздко.

Может есть какие-то более правильные методы?
Спасибо сказали:
Аватара пользователя
Rootlexx
Бывший модератор
Сообщения: 4471
Статус: GNU generation
ОС: Debian GNU/Linux

Re: Bash: FIFO канал - прервать чтение/запись

Сообщение Rootlexx »

Попробуйте так:

Код: Выделить всё

exec 3<>канал
- а затем уже:

Код: Выделить всё

read -t 3 var <&3
Спасибо сказали:
inspirra
Сообщения: 211
ОС: FreeBSD, Gentoo

Re: Bash: FIFO канал - прервать чтение/запись

Сообщение inspirra »

2 Rootlexx

Вот спасибо! Работает! Хотя и не совсем укладывается в голове, почему таймаут не работает напрямую из файла, не через дескриптор.

А с пишущим процессом вероятно уже без внешнего убийства не обойтись?
Спасибо сказали:
Аватара пользователя
Rootlexx
Бывший модератор
Сообщения: 4471
Статус: GNU generation
ОС: Debian GNU/Linux

Re: Bash: FIFO канал - прервать чтение/запись

Сообщение Rootlexx »

inspirra писал(а):
07.10.2010 22:20
А с пишущим процессом вероятно уже без внешнего убийства не обойтись?

Можно попробовать так:

Код: Выделить всё

echo string | dd bs=1 oflag=nonblock status=noxfer of=канал
- но тогда не получится задать время.
Можно ещё попытаться перехватывать SIGPIPE, если он приходит.
Кроме того, если использовать внешнее завершение, то для этого есть специальная программа: timeout.
Спасибо сказали: