में
./binary < file
binary
स्टड फ़ाइल केवल-पढ़ने के लिए मोड में खुला है। ध्यान दें कि bash
फ़ाइल को बिल्कुल भी नहीं पढ़ता है, यह इसे केवल उस प्रक्रिया के फ़ाइल डिस्क्रिप्टर 0 (स्टडिन) पर पढ़ने के लिए खोलता है, जिसमें यह निष्पादित होता binary
है।
में:
./binary << EOF
test
EOF
शेल के आधार पर binary
, स्टड या तो हटाए गए अस्थायी फ़ाइल (AT & T ksh, zsh, bash ...) होगा, जिसमें test\n
शेल या पाइप के रीडिंग एंड ( dash
, yash
और; शेल test\n
समानांतर में लिखते हैं) के रूप में शामिल हैं। पाइप के दूसरे छोर पर)। आपके मामले में, यदि आप उपयोग कर रहे हैं, तो bash
यह एक अस्थायी फ़ाइल होगी।
में:
cat file | ./binary
शेल के आधार पर, binary
स्टड या तो पाइप का रीडिंग एंड होगा, या सॉकेट पेयर का एक सिरा जहां लेखन दिशा को बंद किया गया है (ksh93) और दूसरे छोर पर cat
कंटेंट लिख रहा है file
।
जब स्टड एक नियमित फ़ाइल (अस्थायी या नहीं) होती है, तो यह खोजी होती है। binary
शुरुआत या अंत में जा सकते हैं, रिवाइंड कर सकते हैं, आदि। यह इसे mmap भी कर सकता है, कुछ ioctl()s
FIEMAP / FIBMAP की तरह (यदि <>
इसके बजाय का उपयोग कर रहा है <
, तो यह इसमें छिद्र / पंच छेद कर सकता है, आदि)।
दूसरी तरफ पाइप और सॉकेट जोड़े एक अंतर-प्रक्रिया संचार साधन हैं, डेटा के binary
पास बहुत कुछ नहीं कर सकता है read
(हालांकि कुछ पाइप-विशिष्ट ioctl()
s जैसे कुछ ऑपरेशन भी हैं जो यह उन पर कर सकता है और नियमित फ़ाइलों पर नहीं) ।
अधिकांश समय, यह याद आ रही क्षमता के लिए है seek
कि विफल अनुप्रयोगों का कारण बनता है / जब पाइप के साथ काम करने की शिकायत है, लेकिन यह अन्य सिस्टम कॉल कि नियमित रूप से फाइलों पर मान्य लेकिन फ़ाइलों के विभिन्न प्रकार पर नहीं कर रहे हैं के किसी भी हो सकता है (जैसे mmap()
, ftruncate()
, fallocate()
) । लिनक्स पर, व्यवहार में एक बड़ा अंतर होता है जब आप खोलते हैं /dev/stdin
जबकि fd 0 एक पाइप पर या एक नियमित फ़ाइल पर होता है।
वहाँ कई आदेश हैं जो केवल खोज योग्य फ़ाइलों से निपट सकते हैं, लेकिन जब ऐसा होता है, तो यह आमतौर पर उनके स्टड पर खुलने वाली फ़ाइलों के लिए नहीं होता है।
$ unzip -l file.zip
Archive: file.zip
Length Date Time Name
--------- ---------- ----- ----
11 2016-12-21 14:43 file
--------- -------
11 1 file
$ unzip -l <(cat file.zip)
# more or less the same as cat file.zip | unzip -l /dev/stdin
Archive: /proc/self/fd/11
End-of-central-directory signature not found. Either this file is not
a zipfile, or it constitutes one disk of a multi-part archive. In the
latter case the central directory and zipfile comment will be found on
the last disk(s) of this archive.
unzip: cannot find zipfile directory in one of /proc/self/fd/11 or
/proc/self/fd/11.zip, and cannot find /proc/self/fd/11.ZIP, period.
unzip
फ़ाइल के अंत में संग्रहीत सूचकांक को पढ़ने की जरूरत है, और फिर संग्रह के सदस्यों को पढ़ने के लिए फ़ाइल के भीतर की तलाश करें। लेकिन यहाँ, फ़ाइल (नियमित रूप से पहले मामले में, दूसरे में पाइप) को एक पथ तर्क के रूप में दिया जाता है unzip
, और unzip
इसे स्वयं (आमतौर पर fd पर अन्य को 0 पर खोलता है) बजाय माता-पिता द्वारा पहले से खोले गए fd को प्राप्त करने के बजाय। यह अपने स्टड से ज़िप फ़ाइलों को नहीं पढ़ता है। स्टड ज्यादातर उपयोगकर्ता बातचीत के लिए उपयोग किया जाता है।
यदि आप binary
एक टर्मिनल एमुलेटर में चल रहे इंटरएक्टिव शेल के संकेत पर पुनर्निर्देशन के बिना आप को चलाते हैं , तो binary
स्टड को अपने मूल शेल से विरासत में मिला होगा, जो कि खुद को अपने मूल टर्मिनल एमुलेटर से विरासत में मिला होगा और एक अंतर्निहित होगा pty डिवाइस रीड + राइट मोड (कुछ इस तरह /dev/pts/n
) में खुली ।
उन उपकरणों को खोजने योग्य नहीं हैं। इसलिए, यदि binary
टर्मिनल से इनपुट लेते समय ओके काम करता है , तो संभवतः समस्या मांगने के बारे में नहीं है।
यदि उस 14 का मतलब एक इरानो (एक त्रुटि कोड जिसे सिस्टम कॉल को विफल करके निर्धारित किया गया है) है, तो अधिकांश प्रणालियों पर, यह EFAULT
( खराब पता ) होगा। read()
सिस्टम कॉल कि त्रुटि के साथ विफल अगर एक स्मृति पता है कि लिखने योग्य नहीं है में पढ़ने के लिए कहा जाएगा। यह स्वतंत्र होगा कि क्या एक बिंदु से पाइप या नियमित फ़ाइल के डेटा को पढ़ने के लिए fd और आमतौर पर बग 1 इंगित करेगा ।
binary
संभवतया इसकी स्टड (साथ fstat()
) पर खुली हुई फ़ाइल का प्रकार निर्धारित करता है और बग में चलता है जब यह न तो एक नियमित फ़ाइल है और न ही एक टटी डिवाइस है।
आवेदन के बारे में अधिक जानने के बिना बताना मुश्किल है। के तहत यह चल रहा है strace
(या truss
/ tusc
अपने सिस्टम पर समकक्ष) मदद कर सकता है आइए देखें कि सिस्टम कॉल है क्या हुआ अगर किसी भी है कि यहाँ विफल हो रहा है।
1 आपके प्रश्न के लिए एक टिप्पणी में मैथ्यू इफ द्वारा परिकल्पित परिदृश्य यहाँ बहुत प्रशंसनीय लगता है। उसे उद्धृत करते हुए:
मुझे संदेह है कि यह डेटा को पढ़ने के लिए एक बफर आकार प्राप्त करने के लिए फ़ाइल के अंत की तलाश कर रहा है, बुरी तरह से इस तथ्य से निपट रहा है कि काम नहीं करता है और एक नकारात्मक आकार (एक खराब मॉलोक को संभालने नहीं) को आवंटित करने का प्रयास करता है। बफर को पढ़ने के लिए जो दोष दिए गए हैं उसे पास करना मान्य नहीं है।