एक नामित पाइप में समवर्ती लिखने के लिए क्या गारंटी है?


32

उदाहरण के लिए, मैंने निम्नलिखित की तरह एक नामित पाइप बनाया:

mknod myPipe p

और मैं इसे कुछ प्रक्रिया (उदाहरण के लिए, कुछ सर्वर) से पढ़ता हूं। उदाहरण के उद्देश्यों के लिए, मैंने पूंछ का उपयोग किया:

tail -f myPipe

यदि कई क्लाइंट प्रक्रियाएं इसमें कुछ संदेश लिखती हैं (उदाहरण के लिए echo "msg" >> myPipe, तो क्या कुछ मौका है कि संदेशों को इस तरह से मिलाया जाएगा:

 <beginning of message1><message2><ending of message1>

या नामित पाइप के लिए लिखने की प्रक्रिया परमाणु है?

जवाबों:


29

यह इस बात पर निर्भर करता है कि प्रत्येक प्रक्रिया कितना लिख ​​रही है (यह मानते हुए कि आपका OS इस संबंध में POSIX- अनुरूप है)। से write():

एक पाइप या FIFO के अनुरोधों को निम्नलिखित अपवादों के साथ एक नियमित फ़ाइल के रूप में उसी तरह से हैंडल किया जाएगा:
[…]

  • {PIPE_BUF} बाइट्स या उससे कम के अनुरोध लिखें, जो एक ही पाइप पर लिखने वाली अन्य प्रक्रियाओं के डेटा के साथ इंटरलीव्ड नहीं होंगे । {PIPE_BUF} बाइट्स से अधिक के राइट्स में डेटा इंटरलीव्ड हो सकता है, मनमानी सीमाओं पर, अन्य प्रक्रियाओं द्वारा लिखित के साथ, फ़ाइल स्थिति झंडे का O_NONBLOCK झंडा सेट है या नहीं।

पाइप और एफआईएफओ के संबंध में भी तर्क अनुभाग में:

  • परमाणु / गैर-परमाणु : एक लेखन परमाणु है यदि एक ऑपरेशन में लिखी गई पूरी राशि किसी अन्य प्रक्रिया के डेटा के साथ इंटरलीव्ड नहीं है। यह उपयोगी है जब एक ही पाठक को कई लेखक डेटा भेज रहे हैं। अनुप्रयोगों को यह जानने की जरूरत है कि कितने बड़े पैमाने पर लिखित अनुरोध को परमाणु प्रदर्शन करने की उम्मीद की जा सकती है। इस अधिकतम को {PIPE_BUF} कहा जाता है। POSIX.1-2008 की यह मात्रा यह नहीं बताती है कि क्या {PIPE_BUF} बाइट्स से अधिक के लिए अनुरोध लिखें परमाणु हैं, लेकिन इसके लिए आवश्यक है कि {PIPE_BUF} या उससे कम बाइट्स परमाणु लिखें।

मान यदि PIPE_BUFप्रत्येक कार्यान्वयन द्वारा परिभाषित किया गया है, लेकिन न्यूनतम 512 बाइट्स है (देखें limits.h)। लिनक्स पर, यह 4096 बाइट्स (देखें pipe(7)) है।


5
PIPE_BUF, वैसे, कम से कम 512 होने की गारंटी देता है। ध्यान दें कि आपको यह भी गारंटी देनी होगी कि आपकी प्रक्रिया वास्तव में प्रत्येक लाइन को एक सिंगल कॉल में लिखती है। setvbuf(stdout, NULL, _IOLBF,512)निम्न स्तर के फ़ंक्शंस का उपयोग करने की आवश्यकता के बिना लाइन बफ़रिंग सक्षम करना ( ) ऐसा करेगा।
रैंडम 832

यहां PIPE_BUFसामान्य यूनिक्स सिस्टम पर देखे गए मानों की एक तालिका है : ar.to/notes/posix#pipe-buf
Arto Bendiken

मुझे समझ में नहीं आता कि सॉकेट्स को कैसे गुणा किया जा सकता है ... लेकिन नामित पाइप नहीं कर सकते हैं ?? यूनिक्स पर सब कुछ सिर्फ एक फ़ाइल सही है? लुलज़
अलेक्जेंडर मिल्स

@AlexanderMills: मैं आपकी टिप्पणी को नहीं समझता
Mat

1
@AlexanderMills: नहीं, यह न्यूनतम मूल्य है
Mat
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.