2008-10-07 38 views
7

Tôi đang tìm cách gọi một tiến trình con với một bộ mô tả tập tin được mở cho một đường ống đã cho để cuộc gọi open() không treo chờ phía bên kia của đường ống nhận kết nối.Thiết lập đường ống đọc từ các đường ống được đặt tên mà không bị chặn trong bash

Để chứng minh:

$ mkfifo /tmp/foobar.pipe 
$ some_program --command-fd=5 5</tmp/foobar.pipe 

Trong trường hợp này, some_program không chạy cho đến khi một số quá trình có /tmp/foobar.pipe mở cho ghi; tuy nhiên, some_program có các hiệu ứng hữu ích ngay cả khi nó không nhận lệnh, vì vậy hành vi mong muốn là dành cho some_program để được thực hiện ngay lập tức.

Cơ chế thực hiện điều này bằng cách thực hiện thông qua ngôn ngữ kịch bản thay thế (trăn, perl, v.v.) hoặc trình bao bọc C mở /tmp/foobar.pipe với cờ O_NONBLOCK là hiển nhiên; Tôi đang tìm một giải pháp tinh khiết, nên có thể.

Trả lời

9

Mở FD đọc/viết chứ không phải chỉ đọc khi thiết lập đường ống ngăn chặn chặn.

Để có một chút cụ thể hơn:

$ mkfifo /tmp/foobar.pipe 
$ some_program --command-fd=5 5<>/tmp/foobar.pipe 

ngăn chặn các hành vi chặn không mong muốn, như 5<>/tmp/foobar.pipe mở trong chế độ RW (như trái ngược với mở trong chế độ read-only như với 5</tmp/foobar.pipe) mặc dù O_NONBLOCK vẫn thiết lập. Nhờ waldner trên irc: //irc.freenode.org/#bash cho con trỏ này.

3

Cách duy nhất tôi biết nhận được loại này kết quả là một hack:

mkfifo /tmp/foobar.in 
mkfifo /tmp/foobar.out 
(cat </tmp/foobar.in) >/tmp/foobar.out & 
some_program --command-fd=5 5</tmp/foobar.out 

có lẽ đây sẽ giúp :-)

+0

bạn nói đúng là lỗi đánh máy. chỉ cần chỉnh sửa nó. Và có quá trình nền là xấu xí, đây là lý do tại sao tôi gọi nó là hack :) – Sec

Các vấn đề liên quan