เกี่ยวกับคำถามด้านประสิทธิภาพของคุณไพพ์มีประสิทธิภาพมากกว่าไฟล์เนื่องจากไม่จำเป็นต้องใช้ดิสก์ IO ดังนั้นจึงcmd1 | cmd2
มีประสิทธิภาพมากกว่าcmd1 > tmpfile; cmd2 < tmpfile
(ซึ่งอาจไม่เป็นจริงหากtmpfile
สำรองข้อมูลบนดิสก์ RAM หรืออุปกรณ์หน่วยความจำอื่น ๆ ตามชื่อไปป์ แต่ถ้าเป็นไพพ์ที่มีชื่อcmd1
ควรรันในพื้นหลังเนื่องจากเอาต์พุตสามารถบล็อกได้หากไพพ์เต็ม ) หากคุณต้องการผลมาจากcmd1
และยังคงต้องส่งผลผลิตของตนไปcmd2
คุณควรcmd1 | tee tmpfile | cmd2
ที่จะช่วยให้cmd1
และจะทำงานในแบบคู่ขนานหลีกเลี่ยงการอ่านดิสก์การดำเนินงานจากcmd2
cmd2
ไปป์ที่มีชื่อจะมีประโยชน์ถ้ากระบวนการต่าง ๆ อ่าน / เขียนไปยังไปป์เดียวกัน พวกเขายังสามารถเป็นประโยชน์เมื่อโปรแกรมไม่ได้ออกแบบมาเพื่อการใช้งาน stdin / stdout สำหรับ IO มันจำเป็นต้องใช้ไฟล์ ฉันวางไฟล์เป็นตัวเอียงเพราะไพพ์ที่มีชื่อไม่ใช่ไฟล์ในมุมมองหน่วยเก็บข้อมูลเพราะมันอยู่ในหน่วยความจำและมีขนาดบัฟเฟอร์คงที่แม้ว่าจะมีรายการระบบไฟล์ (เพื่อการอ้างอิง) อื่น ๆสิ่งใน UNIX มีรายการระบบแฟ้มโดยไม่ต้องเป็นไฟล์: เพียงแค่คิดว่า/dev/null
หรือรายการอื่น ๆ ในหรือ/dev
/proc
เนื่องจากไพพ์ (ชื่อและไม่มีชื่อ) มีขนาดบัฟเฟอร์คงที่การดำเนินการอ่าน / เขียนสามารถบล็อกได้ทำให้กระบวนการอ่าน / เขียนดำเนินไปในสถานะ IOWait นอกจากนี้คุณจะได้รับ EOF เมื่ออ่านจากบัฟเฟอร์หน่วยความจำเมื่อใด กฎเกี่ยวกับพฤติกรรมนี้มีการกำหนดไว้อย่างดีและสามารถพบได้ในมนุษย์
สิ่งหนึ่งที่คุณไม่สามารถทำได้กับไพพ์ (ชื่อและไม่ได้ตั้งชื่อ) คือการค้นหาในข้อมูล เนื่องจากมีการใช้งานโดยใช้บัฟเฟอร์หน่วยความจำสิ่งนี้จึงเป็นที่เข้าใจได้
เกี่ยวกับ"everything in Linux/Unix is a file"
ฉันไม่เห็นด้วย ไปป์ที่มีชื่อมีรายการระบบแฟ้ม แต่ไม่ใช่ไฟล์ที่แน่นอน ไพพ์ที่ไม่มีชื่อไม่มีรายการระบบไฟล์ (ยกเว้นอาจจะอยู่ใน/proc
) อย่างไรก็ตามการดำเนินการ IO ส่วนใหญ่บน UNIX ทำได้โดยใช้ฟังก์ชั่นอ่าน / เขียนที่ต้องการfile descriptorรวมถึงไพพ์ที่ไม่มีชื่อ (และซ็อกเก็ต) ผมไม่คิดว่าเราสามารถพูดได้ว่าแต่เราก็สามารถพูดได้ว่า"everything in Linux/Unix is a file"
"most IO in Linux/Unix is done using a file descriptor"