ฉันใช้mkfifo <file>
คำสั่งเพื่อสร้างชื่อ FIFOs โดยที่หนึ่งโพรเซสเขียนไฟล์และอีกโพรเซสอ่านจากไฟล์
ตอนนี้ฉันรู้ว่าmknod
คำสั่งสามารถสร้างไปป์ที่มีชื่อ ไพพ์ที่มีชื่อเหล่านี้เทียบเท่ากับ FIFO ที่สร้างโดยmkfifo
หรือมีคุณสมบัติแตกต่างกันหรือไม่?
ฉันใช้mkfifo <file>
คำสั่งเพื่อสร้างชื่อ FIFOs โดยที่หนึ่งโพรเซสเขียนไฟล์และอีกโพรเซสอ่านจากไฟล์
ตอนนี้ฉันรู้ว่าmknod
คำสั่งสามารถสร้างไปป์ที่มีชื่อ ไพพ์ที่มีชื่อเหล่านี้เทียบเท่ากับ FIFO ที่สร้างโดยmkfifo
หรือมีคุณสมบัติแตกต่างกันหรือไม่?
คำตอบ:
ใช่มันเทียบเท่า แต่เห็นได้ชัดว่าเฉพาะเมื่อคุณบอกmknod
ให้สร้าง FIFO จริง ๆ และไม่ใช่บล็อกหรืออุปกรณ์ตัวอักษร
mkfifo foobar
# same difference
mknod foobar p
ในstrace
มันเป็นเหมือนกันสำหรับคำสั่งทั้งสอง:
mknod("foobar", S_IFIFO|0666) = 0
ดังนั้นในแง่ของการ syscalls, เป็นจริงชวเลขmkfifo
mknod
ความแตกต่างที่ใหญ่ที่สุดนั้นอยู่ในความหมาย ด้วยmkfifo
คุณสามารถสร้าง FIFO จำนวนมากได้ในครั้งเดียว:
mkfifo a b c
ด้วยmknod
เนื่องจากคุณต้องระบุประเภทจึงจะยอมรับเพียงหนึ่งอาร์กิวเมนต์เท่านั้น:
# wrong:
$ mknod a b c p
mknod: invalid major device number ‘c’
# right:
mknod a p
mknod b p
mknod c p
โดยทั่วไปmknod
อาจใช้งานได้ยาก ดังนั้นถ้าคุณต้องการที่จะทำงานร่วมกับ FIFO, mkfifo
ติด
mkfifo
และmknod
เป็นโปรแกรมที่ใช้การmknod
เรียกของระบบ (ไม่รู้ก่อนว่าการเรียกระบบนั้นมาก่อน) เพื่อสร้าง FIFO คุณใช้คำว่า "FIFO" และ "ตั้งชื่อว่า" สลับกันได้ฉันเดา พวกเขาเป็นสิ่งเดียวกันหรือไม่ ไปป์ที่มีชื่อแบบสองทิศทางถูกนำมาใช้โดยซ็อกเก็ตโดเมน Unix ใช่ไหม
พวกเขาจะเทียบเท่ายกเว้นที่ขอบสุดของการพกพา mknod ... p
เดิมทีเป็นวิธีเดียวในการสร้างไพพ์ที่มีชื่อ แต่ POSIX เลือกที่จะไม่ใช้มันและคิดค้นmkfifo
แทนเนื่องจากสันนิษฐานว่าไพพ์ที่มีชื่อเป็นแนวคิดแบบพกพาที่มีอยู่จริงมากกว่าสิ่งอื่น ๆ ที่อุปกรณ์อื่น ๆmknod
สามารถทำได้กับอุปกรณ์และหมายเลขหลักและรอง การmknod
เรียกระบบยังถูกทิ้งไว้จาก verion เริ่มต้นของ POSIX
ดังนั้นสำหรับการพกพาไปยัง UNIX โบราณmknod ... p
ดีกว่า สำหรับระบบที่ทันสมัยmkfifo
นั้นดีกว่าเล็กน้อยแม้ว่ามันจะไม่น่าเป็นไปได้ที่คุณจะพบยูนิกซ์สมัยใหม่ที่mknod ... p
ใช้งานไม่ได้
mkfifo(2)
เป็นการโทรจากระบบแยกต่างหากจริงๆmknod(2)
(แต่มันจะจบลงด้วยการทำสิ่งเดียวกันmknod(S_FIFO)
)