ฉันใช้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, เป็นจริงชวเลขmkfifomknod
ความแตกต่างที่ใหญ่ที่สุดนั้นอยู่ในความหมาย ด้วย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))