Существует предостережение относительно чтения из именованного канала. Когда вы открываете именованный канал, ваш open()
вызов зависает, пока не появится писатель. Когда писатель обнаруживается, последующие read()
вызовы вернут все данные, которые писатель записал в канал. Однако, когда средство записи закрывает канал (или выходит), read()
вызовы начинают возвращать 0 (а не блокировать).
Это причина того, что вместо
int fd = open("testpipe", O_RDONLY);
кто-то может захотеть открыть такую трубу
int fd = open("testpipe", O_RDWR);
Таким образом, процесс не только читатель, но и писатель. Несмотря на то, что вы никогда ничего не записываете в канал, это гарантирует, что записывающее устройство существует, и, следовательно, read()
вызовы не возвращают 0, а вместо этого блокируют ожидание того, что какой-либо записывающий записывает что-либо в конвейер.
Теперь, когда ваш скрипт делает это:
while [ 1 -eq 1 ] do read input ... done < $pipename
ваша оболочка открывает канал только для чтения ( O_RDONLY
).
Решение вашей проблемы - сделать так, чтобы shell открывал канал для чтения и записи следующим образом:
while [ 1 -eq 1 ] do read input ... done <> $pipename
Обратите внимание на замену < $pipename
с <> $pipename
. Это то, что заставляет оболочку открывать канал для чтения и записи ( O_RDWR
).