2008-10-07 12 views
7

में अवरुद्ध किए बिना नामित पाइपों से पढ़ने वाली पाइपलाइनों को सेट करना मैं किसी दिए गए पाइप पर खोले गए फ़ाइल डिस्क्रिप्टर के साथ एक उपप्रोसेसर को कॉल करना चाहता हूं जैसे कि खुले() कॉल पाइप के दूसरी तरफ प्रतीक्षा नहीं कर रहा है एक कनेक्शन प्राप्त करें।बैश

प्रदर्शित करने के लिए:

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

इस मामले में, some_program जब तक कुछ प्रक्रिया /tmp/foobar.pipe खुला है लिखने के लिए नहीं चला जाता है; हालांकि, some_program के पास कम प्रभाव प्राप्त होने पर भी उपयोगी प्रभाव पड़ते हैं, इसलिए वांछित व्यवहार some_program के लिए तत्काल निष्पादित किया जाना है।

O_NONBLOCK ध्वज के साथ /tmp/foobar.pipe खोलने वाली एक वैकल्पिक स्क्रिप्टिंग भाषा (पायथन, पर्ल, आदि) या एक सी रैपर के माध्यम से निष्पादित करके ऐसा करने के लिए तंत्र स्पष्ट हैं; मैं एक शुद्ध-बैश समाधान की तलाश में हूं, क्या एक संभव होना चाहिए।

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

शायद इस मदद करता है :-)

उत्तर

9

एफडी/से केवल पढ़ने के लिए नहीं बल्कि बारे में पढ़ने के लिए जब की स्थापना खुलने:

3

एक ही रास्ता मैं परिणाम इस तरह की हो रही है पता हैक है पाइपलाइन अवरुद्ध रोकता है।

में थोड़ा और अधिक विशिष्ट होना करने के लिए:

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

अवांछित अवरुद्ध व्यवहार से बचाता है, के रूप में 5<>/tmp/foobar.pipe (के रूप में 5</tmp/foobar.pipe साथ के रूप में केवल-पठन मोड में खोलने के खिलाफ) आरडब्ल्यू मोड में खोले हालांकि O_NONBLOCK अभी भी स्थापित किया जाएगा। इस पॉइंटर के लिए irc: //irc.freenode.org/#bash पर waldner के लिए धन्यवाद।

+0

आप सही हैं यह एक टाइपो था। बस इसे संपादित किया। और हाँ पृष्ठभूमि प्रक्रिया बदसूरत है, यही कारण है कि मैं इसे एक हैक कहा जाता है :) – Sec