ใน
./binary < file
binary's stdin คือไฟล์ที่เปิดในโหมดอ่านอย่างเดียว โปรดทราบว่าbashไม่อ่านไฟล์ทั้งหมดก็เพียงแค่เปิดมันสำหรับการอ่านบนอธิบายไฟล์ 0 (stdin) ของกระบวนการที่จะรันbinaryใน
ใน:
./binary << EOF
test
EOF
ขึ้นอยู่กับเชลล์binarystdin ของจะเป็นไฟล์ชั่วคราวที่ถูกลบ (AT&T ksh, zsh, bash ... ) ที่บรรจุtest\nไว้โดยเชลล์หรือที่ปลายอ่านของไพพ์ ( dash, yashและเชลล์เขียนtest\nแบบขนาน) ที่ปลายอีกด้านของท่อ) ในกรณีของคุณถ้าคุณใช้bashมันจะเป็นไฟล์ชั่วคราว
ใน:
cat file | ./binary
ขึ้นอยู่กับเชลล์binarystdin ของจะเป็นปลายอ่านของท่อหรือปลายด้านหนึ่งของซ็อกเก็ตคู่ที่ทิศทางการเขียนถูกปิด (ksh93) และcatกำลังเขียนเนื้อหาของfileที่ปลายอีกด้านหนึ่ง
เมื่อ stdin เป็นไฟล์ปกติ (ชั่วคราวหรือไม่) ก็จะหาได้ binaryอาจไปที่จุดเริ่มต้นหรือจุดสิ้นสุดย้อนกลับ ฯลฯ นอกจากนี้ยังสามารถ mmap ทำบางอย่างioctl()sเช่น FIEMAP / FIBMAP (หากใช้<>แทน<มันสามารถตัด / เจาะรูใน ฯลฯ )
ท่อและซ็อกเก็ตคู่ในอีกทางหนึ่งคือการสื่อสารระหว่างกระบวนการหมายความว่าไม่มีอะไรที่binaryสามารถทำได้นอกเหนือreadจากข้อมูล (แม้ว่าจะมีการดำเนินการบางอย่างเช่นท่อเฉพาะบางอย่างioctl()ที่สามารถทำได้กับพวกเขาและไม่ใช่ไฟล์ปกติ) .
มากที่สุดเท่าที่มันเป็นความสามารถไปseekที่ทำให้เกิดการใช้งานที่จะล้มเหลว / บ่นเมื่อทำงานร่วมกับท่อ แต่มันอาจจะเป็นที่ใด ๆ ของสายระบบอื่น ๆ ที่ถูกต้องเกี่ยวกับไฟล์ปกติ แต่ไม่เกี่ยวกับชนิดของไฟล์ (เช่นmmap(), ftruncate(), fallocate()) . บน Linux ยังมีพฤติกรรมที่แตกต่างกันมากเมื่อคุณเปิด/dev/stdinในขณะที่ fd 0 อยู่ในไพพ์หรือไฟล์ปกติ
มีคำสั่งจำนวนมากออกมีที่สามารถจัดการกับseekableไฟล์ แต่เมื่อเป็นกรณีที่ว่าโดยทั่วไปไม่ได้สำหรับไฟล์ที่เปิด stdin ของพวกเขา
$ 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 ที่เปิดโดยผู้ปกครอง ไม่อ่านไฟล์ zip จาก stdin stdin ส่วนใหญ่จะใช้สำหรับการโต้ตอบกับผู้ใช้
หากคุณเรียกใช้งานbinaryของคุณโดยไม่มีการเปลี่ยนเส้นทางที่พร้อมต์ของเชลล์แบบโต้ตอบที่ทำงานในเทอร์มินัลอีมูเลเตอร์binarystdin ของจะถูกสืบทอดมาจากพาเรนต์ของเชลล์ซึ่งตัวมันเองจะได้รับสืบทอดจากพาเรนต์เทอร์มินัล อุปกรณ์ pty เปิดในโหมดอ่าน + เขียน (คล้าย/dev/pts/n)
อุปกรณ์เหล่านั้นหาไม่ได้เช่นกัน ดังนั้นหากใช้binaryงานได้ดีเมื่อรับข้อมูลจากเทอร์มินัลปัญหาอาจไม่เกี่ยวกับการค้นหา
หาก 14 นั้นหมายถึงว่าเป็น errno (รหัสข้อผิดพลาดที่ตั้งค่าโดยการเรียกระบบล้มเหลว) แสดงว่าในระบบส่วนใหญ่นั้นจะเป็นEFAULT( ที่อยู่ไม่ถูกต้อง) การread()เรียกของระบบอาจล้มเหลวพร้อมกับข้อผิดพลาดนั้นหากถูกขอให้อ่านที่อยู่หน่วยความจำที่ไม่สามารถเขียนได้ ที่จะเป็นอิสระจากว่า FD ในการอ่านข้อมูลจากจุดไปยังท่อหรือแฟ้มปกติและโดยทั่วไปจะระบุข้อผิดพลาด1
binaryอาจกำหนดประเภทของไฟล์ที่เปิดอยู่บน stdin (พร้อมfstat()) และพบข้อผิดพลาดเมื่อไม่ใช่ไฟล์ปกติหรืออุปกรณ์ tty
ยากที่จะบอกโดยไม่ทราบเพิ่มเติมเกี่ยวกับแอปพลิเคชัน การเรียกใช้ภายใต้strace(หรือtruss/ tuscเทียบเท่าในระบบของคุณ) สามารถช่วยให้เราเห็นว่าการเรียกของระบบคืออะไรหากมีสิ่งใดที่ล้มเหลวที่นี่
1สถานการณ์สมมติโดยMatthew Ifeแสดงความคิดเห็นต่อคำถามของคุณฟังดูมีเหตุผลมากที่นี่ อ้างถึงเขา:
  ฉันสงสัยว่ามันกำลังมองหาจุดสิ้นสุดของไฟล์เพื่อรับขนาดบัฟเฟอร์สำหรับการอ่านข้อมูลการจัดการกับความจริงที่ว่าการค้นหาไม่ได้ผลและพยายามจัดสรรขนาดลบ (ไม่จัดการ malloc ที่ไม่ดี) การส่งผ่านบัฟเฟอร์เพื่ออ่านว่าข้อบกพร่องใดที่กำหนดให้บัฟเฟอร์นั้นไม่ถูกต้อง