2011-06-23 31 views
10

tôi tạo ra một đường ống sử dụng'đọc' không thời gian ra ngoài khi đọc từ đường ống trong bash

mkfifo /tmp/foo.pipe 

Bây giờ, tôi muốn thử đọc từ các đường ống tối đa là 2 giây, vì vậy tôi thực hiện

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

Thời gian chờ không xảy ra. Đọc chỉ ngồi đó chờ đợi cho đầu vào từ đường ống.

Sách hướng dẫn nói rằng 'đọc' được cho là hoạt động với các đường ống có tên. Có ai có một ý tưởng tại sao điều này đang xảy ra?

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

acceptAnswer | askQuestion –

+0

Chào mừng bạn đến với Stack Overflow! Nếu bạn chấp nhận câu trả lời cho câu hỏi của mình bằng cách nhấp vào dấu kiểm màu xanh bên cạnh câu trả lời hay nhất (nếu có), mọi người sẽ có nhiều khả năng đưa ra câu trả lời cho câu hỏi của bạn hơn. –

Trả lời

15

Vỏ của bạn đang chặn cuộc gọi mở() trước khi gọi nội dung đã đọc.

Trên Linux, bạn có thể mở FIFO để đọc và ghi cùng một lúc để ngăn chặn việc chặn mở; điều này là không di động, nhưng có thể làm những gì bạn muốn.

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

Phỏng theo: Bash script with non-blocking read

0

Vỏ của bạn là trình giữ nó đang cố gắng đọc từ đường ống để nạp dữ liệu vào lệnh đọc và vì nó không nhận được bất kỳ thứ gì mà nó chỉ ngồi ở đó chờ đợi.

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

Điều đó chỉ đặt thời gian chờ mặc định, nó không thay đổi cách 'đọc' thực sự thực hiện thời gian chờ. – Barmar

1

Nếu bạn chỉ muốn tuôn (và loại bỏ) các dữ liệu từ FIFO:

dd iflag=nonblock if=/tmp/foo.pipe of=/dev/null &> /dev/null 
Các vấn đề liên quan