2011-06-23 9 views
10

utworzyć rurę przy użyciu„czytać” nie limit czasu podczas czytania z potoku w bash

mkfifo /tmp/foo.pipe 

Teraz chcę spróbować czytanie z rury dla maksymalnie 2 sekundy, więc wykonać

read -t 2 line < /tmp/foo.pipe 

Limit czasu nie występuje. Czytaj tylko siedzi i czeka na wejście z rury.

W podręcznikach napisano, że "odczyt" ma działać z nazwanymi potokami. Czy ktoś ma pomysł, dlaczego tak się dzieje?

ls -al /tmp/foo.pipe 
prw-r----- 1 foo bar 0 Jun 22 19:06 /tmp/foo.pipe 
+0

acceptAnswer | askQuestion –

+0

Witamy w Stack Overflow! Jeśli zaakceptowałeś odpowiedzi na swoje pytania, klikając zielony znacznik wyboru obok najlepszej odpowiedzi (jeśli taki istnieje), ludzie chętniej udzielą odpowiedzi na Twoje pytania. –

Odpowiedz

15

Twoja powłoka blokuje wywołanie open() przed wywołaniem wbudowanego odczytu.

W systemie Linux można otworzyć FIFO zarówno do odczytu, jak i zapisu w tym samym czasie, aby zapobiec blokowaniu przy otwartym; to nie jest przenośne, ale może robić, co chcesz.

read -t 2 <>/tmp/foo.pipe 

Adaptacja: Bash script with non-blocking read

0

Twój powłoka jest ten, który trzyma go w górę, to próbuje odczytać z rury karmić dane do polecenia odczytu, a ponieważ nie robi nic po prostu siedzi tam czeka.

-1
TMOUT=2 
read line < /tmp/foo.pipe 
+0

To właśnie ustawia domyślny limit czasu, nie zmienia sposobu, w jaki 'odczyt' faktycznie implementuje limit czasu. – Barmar

1

Jeśli chcesz tylko do spłukiwania (i wyrzucić) dane z FIFO:

dd iflag=nonblock if=/tmp/foo.pipe of=/dev/null &> /dev/null