ไปป์ที่มีชื่อถูกสร้างขึ้นโดย `mknod` และ FIFO ที่สร้างโดย 'mkfifo` ที่เทียบเท่าหรือไม่


22

ฉันใช้mkfifo <file>คำสั่งเพื่อสร้างชื่อ FIFOs โดยที่หนึ่งโพรเซสเขียนไฟล์และอีกโพรเซสอ่านจากไฟล์

ตอนนี้ฉันรู้ว่าmknodคำสั่งสามารถสร้างไปป์ที่มีชื่อ ไพพ์ที่มีชื่อเหล่านี้เทียบเท่ากับ FIFO ที่สร้างโดยmkfifoหรือมีคุณสมบัติแตกต่างกันหรือไม่?

คำตอบ:


29

ใช่มันเทียบเท่า แต่เห็นได้ชัดว่าเฉพาะเมื่อคุณบอก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ติด


16
ในขณะที่ OP ไม่สนใจเนื่องจาก Q ไม่ได้ติดแท็ก [linux] สังเกตว่าใน BSD mkfifo(2) เป็นการโทรจากระบบแยกต่างหากจริงๆmknod(2)(แต่มันจะจบลงด้วยการทำสิ่งเดียวกันmknod(S_FIFO))
mosvy

@frostschutz - ขอบคุณสำหรับคำตอบที่ยอดเยี่ยม ดังนั้นเพื่อชี้แจงสิ่งต่างๆ mkfifoและmknodเป็นโปรแกรมที่ใช้การmknodเรียกของระบบ (ไม่รู้ก่อนว่าการเรียกระบบนั้นมาก่อน) เพื่อสร้าง FIFO คุณใช้คำว่า "FIFO" และ "ตั้งชื่อว่า" สลับกันได้ฉันเดา พวกเขาเป็นสิ่งเดียวกันหรือไม่ ไปป์ที่มีชื่อแบบสองทิศทางถูกนำมาใช้โดยซ็อกเก็ตโดเมน Unix ใช่ไหม
Shuzheng

ใช่ "ชื่อท่อ" และ FIFO มักจะหมายถึงสิ่งเดียวกัน (ในบริบทของท่อ - FIFO เป็นแนวคิดที่มีอยู่นอกท่อเช่นกัน) ซ็อกเก็ตเป็นสัตว์ร้ายที่แตกต่างกันโดยสิ้นเชิงคำตอบที่น่าสนใจบางอย่างที่นี่: unix.stackexchange.com/q/75904/30851
frostschutz

@frostschutz - ขอบคุณ ฉันเดาว่าสิ่งที่ทำให้ฉันสับสนมากที่สุดคือเมื่อฉันคิดถึงท่อที่มีชื่อฉันก็นึกถึงท่อสองทิศทาง - และ FIFO นั้นไม่ใช่แบบสองทิศทาง (AFAIK)
Shuzheng

@Shuzheng a FIFO ไม่มีกฎใด ๆ เกี่ยวกับทิศทางจริงๆ มันเป็นเพียงการอ่านและเขียน สามารถมีผู้อ่านและนักเขียนจำนวนเท่าใดก็ได้ แต่สิ่งที่เขียนสามารถอ่านได้ครั้งเดียวเท่านั้นดังนั้นจึงไม่มีความชัดเจนว่าใครจะได้รับข้อมูลในท้ายที่สุด
frostschutz

18

พวกเขาจะเทียบเท่ายกเว้นที่ขอบสุดของการพกพา mknod ... pเดิมทีเป็นวิธีเดียวในการสร้างไพพ์ที่มีชื่อ แต่ POSIX เลือกที่จะไม่ใช้มันและคิดค้นmkfifoแทนเนื่องจากสันนิษฐานว่าไพพ์ที่มีชื่อเป็นแนวคิดแบบพกพาที่มีอยู่จริงมากกว่าสิ่งอื่น ๆ ที่อุปกรณ์อื่น ๆmknodสามารถทำได้กับอุปกรณ์และหมายเลขหลักและรอง การmknodเรียกระบบยังถูกทิ้งไว้จาก verion เริ่มต้นของ POSIX

ดังนั้นสำหรับการพกพาไปยัง UNIX โบราณmknod ... pดีกว่า สำหรับระบบที่ทันสมัยmkfifoนั้นดีกว่าเล็กน้อยแม้ว่ามันจะไม่น่าเป็นไปได้ที่คุณจะพบยูนิกซ์สมัยใหม่ที่mknod ... pใช้งานไม่ได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.