क्या पाइप में अस्थायी फ़ाइल लिखना है?


11

मैंने पाया कि अगर मैं पाइप के माध्यम से दो प्रक्रियाओं के बीच बड़ी मात्रा में डेटा ट्रांसफर करता हूं, तो कुछ अस्थायी फ़ाइल लिनक्स / tmp डायरेक्टरी द्वारा बनाई जाएगी। यदि पाइप संचालन सफल होता है, तो संबंधित अस्थायी फ़ाइल ओएस द्वारा स्वचालित रूप से हटा दी जाएगी। लेकिन यदि ऑपरेशन विफल हो गया, तो tmp फ़ाइल वहां बनी रहती है।

किसी कारण से, मैं नहीं चाहता कि उपयोगकर्ता के पास ट्रॉटो पाइप स्थानांतरित किए गए डेटा को प्राप्त करने के लिए उत्पीड़न हो, इसलिए मैं नहीं चाहता कि हार्डडिस्क पर कुछ भी बचा हो, भले ही मेरा कार्यक्रम दुर्घटनाग्रस्त हो गया हो। मैं यह कैसे कर सकता हूँ?


4
मुझे बहुत संदेह है कि यह ओएस इन फ़ाइलों को बना रहा है, विशेष रूप से, मुझे संदेह है कि यह पाइप ऑपरेशन है।

@ नील: बहुत अच्छी बात है। @OP: क्या आपको यकीन है कि रिसीवर tmp फ़ाइल के लिए डेटा को प्राप्त नहीं कर रहा है? यदि यह आपका अपना कोड नहीं है और न ही ओपन सोर्स है, तो आप संभवतः अपने आउटपुट को अपने प्रेषक से किसी फ़ाइल में रीडायरेक्ट करके देख सकते हैं, और फिर उस रिसीवर को इसकी इनपुट स्ट्रीम के रूप में भेज सकते हैं, जैसे: sender > filenameतब receiver < filename। मैं दोनों ऑप्स के दौरान tmp फ़ाइल की जाँच करूँगा, यह देखने के लिए कि क्या प्रेषक या रिसीवर ऐसा कर रहा है।

2
उत्तर नहीं है, लेकिन मुझे यहां पाइप से निपटने पर बहुत सारी उपयोगी जानकारी मिली : < slacy.com/blog/2008/12/on-mkfifo-and-doing-the-impossible >। पता नहीं यह व्यक्ति कितना आधिकारिक है, लेकिन वह विशेष रूप से उल्लेख करता है कि एक- mkfifoअनुपचारित पाइप कभी भी कोई बफरिंग नहीं करता है (बिल्कुल भी!) और कभी भी फाइल नहीं बनाता है।
कार्ल स्मोत्रिकज़

1
@Carl Smotricz: लिंक टूट गया है, तो यहाँ है: slacy.com/blog/2008/12/12/on-mkfifo-and-doing-the-impossible

इसके अलावा, यदि पाइप बहुत भरा हुआ है (जब तक कि कोई व्यक्ति दूसरे छोर से नहीं पढ़ता है) एक पाइप पर लिखना बंद हो जाएगा।

जवाबों:


11
  1. पाइप डिस्क पर डेटा संग्रहीत नहीं करते हैं। / बिन / गूंज फू | grep बार कोई भी फाइल नहीं बनाता है। strace -f sh -c '/bin/echo foo | grep bar' पाइपलाइन चलाते समय शेल द्वारा किए गए सभी सिस्टम कॉल को देखने का प्रयास करें। echoएक शेल बिलिन है, इसलिए मैंने /bin/echoशेल को एक निष्पादन योग्य बनाने का सुझाव दिया ।

  2. /tmpडिस्क पर होना आवश्यक नहीं है। इसे tmpfs (यानी वर्चुअल मेमोरी द्वारा समर्थित) पर माउंट किया जा सकता है। ध्यान दें कि /tmpउस स्थिति में एक रिबूट खाली हो जाएगा , इसलिए जिस /var/tmpचीज को आप चारों ओर छोड़ना चाहते हैं उसके लिए उपयोग करें ।

यदि आप जो कर रहे हैं वह डेटा को फ़ाइल में डाल रहा है, तो यह पाइप का उपयोग नहीं कर रहा है। यदि फ़ाइल एक फ़ाइनली है, नियमित फ़ाइल नहीं है, तो यह सिर्फ एक नाम दिया गया है, और इसमें डेटा नहीं है। पता लगाने के लिए ls -l का उपयोग करें।

और ध्यान दें कि यदि आप उपयोगकर्ताओं को यह देखने से रोकने की उम्मीद कर रहे हैं कि वे अपने द्वारा की जाने वाली प्रक्रियाओं में पाइपों के माध्यम से क्या कर रहे हैं, तो आप बहुत ज्यादा एसओएल हैं, क्योंकि straceप्रक्रिया के बाहर किसी भी चीज के साथ इंटरैक्ट करने वाली हर चीज का निरीक्षण कर सकते हैं, सिवाय पढ़ने / लिखने के स्मृति। ltraceऔर भी आक्रामक है। यदि आपका प्रोग्राम उन सिस्टमों पर चलेगा जहाँ स्थानीय उपयोगकर्ता की जड़ें हैं, तो आप उन्हें बिल्कुल नहीं रोक सकते। यूनिक्स पर, रूट कुछ भी कर सकता है, और उद्देश्य के लिए शक्तिशाली उपकरण हैं।


1

एक असली पाइप कर्नेल में मेमोरी का एक ब्लॉक है, एक बफर जो कुछ प्रक्रियाओं द्वारा पढ़ा / लिखा जाता है। यह कहीं भी फाइल नहीं बनाता है।

कुछ ऐप में विकल्प होते हैं जो पाइप का उपयोग करने के बीच स्विच करते हैं (तेजी से, कोई डिस्क नहीं, थोड़ी अधिक मेमोरी लेता है) और अस्थायी फ़ाइलों का उपयोग करके (थोड़ी कम मेमोरी लेता है, आपको संभवतः अस्थायी फ़ाइलें, एक टच धीमी देखने की अनुमति देता है)। gccऐसा ही एक आवेदन है, हालांकि शायद अन्य हैं।


0

डर्टी हैक: भेजने से पहले डेटा को एन्क्रिप्ट करें और प्राप्त करने पर डिक्रिप्ट करें यदि आप दोनों प्रक्रियाओं को बदल सकते हैं ...


वास्तव में इसे गंदा हैक नहीं कहेंगे: यदि डेटा संवेदनशील है, तो उचित समाधान लगता है। लेकिन मैं tmp फ़ाइल के बारे में उत्सुक हूँ। क्या ओपी सही है कि कर्नेल इसे बना रहा है? या नील सही है और यह पाइप का एक छोर है या अन्य ...

कर्नेल एक अस्थायी फ़ाइल नहीं बना रहा है। दूसरी ओर, यह बहुत संभावना है कि प्राप्त करने की प्रक्रिया एक अस्थायी फ़ाइल बना रही है। यह बहुत आम है, क्योंकि यदि आप अपने इनपुट में तलाश करना चाहते हैं, तो आपको इसे पहले एक फ़ाइल में लिखना होगा।
लार्क्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.