เกือบทุกอย่างใน Linux ถือได้ว่าเป็นไฟล์แต่ความแตกต่างหลักระหว่างไฟล์ปกติกับไพพ์ที่มีชื่อคือไพพ์ที่มีชื่อนั้นเป็นอินสแตนซ์พิเศษของไฟล์ที่ไม่มีเนื้อหาในระบบไฟล์
นี่คือคำพูดจากman fifo
:
ไฟล์พิเศษของ FIFO (ไพพ์ที่มีชื่อ) นั้นคล้ายกับไพพ์ยกเว้นว่ามันถูกเข้าถึงเป็นส่วนหนึ่งของระบบไฟล์ สามารถเปิดได้หลายขั้นตอนสำหรับการอ่านหรือการเขียน เมื่อกระบวนการกำลังแลกเปลี่ยนข้อมูลผ่าน FIFO เคอร์เนลจะส่งข้อมูลทั้งหมดภายในโดยไม่ต้องเขียนลงในระบบไฟล์ ดังนั้นไฟล์พิเศษ FIFO จึงไม่มีเนื้อหาในระบบไฟล์ รายการระบบไฟล์ทำหน้าที่เป็นเพียงจุดอ้างอิงเพื่อให้กระบวนการสามารถเข้าถึงไปป์โดยใช้ชื่อในระบบไฟล์
เคอร์เนลรักษาหนึ่งไปป์วัตถุแน่นอนสำหรับแต่ละไฟล์พิเศษ FIFO ที่เปิดโดยกระบวนการอย่างน้อยหนึ่ง FIFO จะต้องเปิดทั้งสองด้าน (การอ่านและการเขียน) ก่อนที่จะสามารถส่งผ่านข้อมูลได้ โดยปกติการเปิดบล็อก FIFO จนกว่าจะเปิดปลายอีกด้าน
จริง ๆ แล้วไพพ์ที่มีชื่อจะไม่ทำอะไรเลยจนกว่ากระบวนการบางอย่างจะอ่านและเขียนลงไป ไม่ใช้พื้นที่บนฮาร์ดดิสก์ (ยกเว้นข้อมูลเมตาเล็กน้อย) ไม่ใช้ CPU
คุณสามารถตรวจสอบได้โดยทำสิ่งนี้:
สร้างไปป์ที่มีชื่อ
$ mkfifo /tmp/testpipe
ไปที่ไดเรกทอรีบางตัว/home/user/Documents
และ gzip ทุกอย่างที่อยู่ในนั้นโดยใช้ไพพ์ที่มีชื่อ
$ cd /home/user/Documents
$ tar cvf - . | gzip > /tmp/testpipe &
[1] 28584
ที่นี่คุณควรเห็น PID ของกระบวนการ gzip ในตัวอย่างของเรามันคือ 28584
ตรวจสอบสิ่งที่ PID กำลังทำอยู่
$ ps u -P 28584
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
c0rp 28584 0.0 0.0 29276 7800 pts/8 S 00:08 0:00 bash
คุณจะเห็นว่ามันคือการใช้ทรัพยากร การใช้งาน CPU 0%, การใช้งานหน่วยความจำ 0%
ตรวจสอบลางสังหรณ์เกี่ยวกับการใช้พื้นที่ไฟล์
$ du -h /tmp/testpipe
0 testpipe
และ0
ไม่มีอะไรอีกแล้ว สามารถใช้ testpipe อีกครั้งหากจำเป็น
อย่าลืมที่จะฆ่า gzip kill -15 28584
ใช้ และลบไปป์ที่มีชื่อของเราโดยใช้rm /tmp/testpipe
ตัวอย่างประเพณี
คุณสามารถเปลี่ยนเส้นทางเกือบทุกอย่างโดยใช้ชื่อไปป์ ตัวอย่างเช่นคุณสามารถเห็นพร็อกซีหนึ่งบรรทัดนี้
นอกจากนี้ที่นี่เป็นอีกหนึ่งคำอธิบายที่ดีของการใช้ไปป์ที่มีชื่อ คุณสามารถกำหนดค่าสองกระบวนการในเซิร์ฟเวอร์เดียวเพื่อสื่อสารโดยใช้ไพพ์ที่มีชื่อแทนที่จะเป็น TCP / IP สแต็ก มันเร็วกว่ามากและไม่โหลดทรัพยากรเครือข่าย ตัวอย่างเช่นเว็บเซิร์ฟเวอร์ของคุณสามารถสื่อสารกับฐานข้อมูลโดยตรงโดยใช้ไพพ์ที่มีชื่อแทนที่จะใช้ที่localhost
อยู่หรือฟังพอร์ตบางตัว