Các ống có tên được tạo bởi `mknod` và FIFO được tạo bởi` mkfifo` có tương đương không?


22

Tôi đã sử dụng mkfifo <file>lệnh để tạo các FIFO có tên, trong đó một quy trình ghi vào tệp và một quy trình khác đọc từ tệp.

Bây giờ, tôi biết mknodlệnh có thể tạo các đường ống được đặt tên. Những ống được đặt tên này có tương đương với các bộ xếp hình được tạo bởi mkfifohoặc chúng có các tính năng khác nhau không?

Câu trả lời:


29

Vâng, nó tương đương, nhưng rõ ràng chỉ khi bạn mknodthực sự tạo ra một bộ xếp hình chứ không phải là một khối hoặc thiết bị nhân vật (hiếm khi được thực hiện trong những ngày này như devtmpfs / udev làm điều đó cho bạn).

mkfifo foobar
# same difference
mknod foobar p

Trong straceđó giống hệt nhau cho cả hai lệnh:

mknod("foobar", S_IFIFO|0666)           = 0

Vì vậy, về mặt tòa nhà, mkfifothực sự là tốc ký mknod.

Sự khác biệt lớn nhất, sau đó, là trong ngữ nghĩa. Với mkfifobạn có thể tạo ra một loạt các FIFO trong một lần:

mkfifo a b c

Với mknod, vì bạn phải chỉ định loại, nên nó chỉ chấp nhận một đối số:

# wrong:
$ mknod a b c p
mknod: invalid major device number ‘c’
# right:
mknod a p
mknod b p
mknod c p

Nói chung, mknodcó thể khó sử dụng chính xác. Vì vậy, nếu bạn muốn làm việc với FIFO, hãy gắn bó mkfifo.


16
Mặc dù OP chắc chắn không quan tâm, vì Q không được gắn thẻ [linux], lưu ý rằng trên BSD mkfifo(2) thực sự là một cuộc gọi hệ thống riêng biệt mknod(2)(nhưng cuối cùng nó sẽ thực hiện chính xác như vậy mknod(S_FIFO)).
mosvy

@frostschutz - cảm ơn bạn đã trả lời tuyệt vời. Vì vậy, chỉ để làm rõ mọi thứ. mkfifomknodthực sự là các chương trình sử dụng lệnh mknodgọi hệ thống (không biết về cuộc gọi hệ thống đó trước ngày hôm nay) để tạo ra một bộ xếp hình. Bạn sử dụng các thuật ngữ "FIFO" và "được đặt tên" thay thế cho nhau, tôi đoán vậy. Họ là những điều tương tự? Các ống có tên hai chiều được thực hiện bằng các ổ cắm tên miền Unix, phải không?
Shuzheng

Có, "ống có tên" và FIFO thường đề cập đến cùng một thứ (trong ngữ cảnh của đường ống - FIFO là một khái niệm tồn tại bên ngoài đường ống). Một ổ cắm là một con thú khác nhau hoàn toàn, một số câu trả lời thú vị cho điều đó ở đây: unix.stackexchange.com/q/75904/30851
frostschutz

@frostschutz - cảm ơn bạn. Tôi đoán điều khiến tôi bối rối nhất là, khi tôi nghĩ về các đường ống được đặt tên, tôi cũng nghĩ về các đường ống hai chiều - và một chiếc FIFO chắc chắn không phải là hai hướng (AFAIK).
Shuzheng

@Shuzheng một FIFO không có bất kỳ quy tắc nào về hướng thực sự. Nó thực sự chỉ cần đọc và viết. Có thể có bất kỳ số lượng độc giả và nhà văn, nhưng bất cứ điều gì được viết chỉ có thể được đọc một lần, vì vậy không rõ ai sẽ nhận được dữ liệu cuối cùng.
frostschutz

18

Chúng tương đương ngoại trừ ở các cạnh cực của tính di động. mknod ... pban đầu là cách duy nhất để tạo ra các ống có tên, nhưng POSIX đã chọn bỏ qua nó và mkfifothay vào đó, có lẽ vì các ống được đặt tên là một khái niệm di động vốn có hơn tất cả những thứ khác mknodcó thể làm với các thiết bị và số chính và số phụ của chúng. Cuộc mknodgọi hệ thống cũng bị loại khỏi các phiên bản đầu của POSIX.

Vì vậy, đối với tính di động đối với UNIX cổ, mknod ... plà tốt hơn. Đối với các hệ thống hiện đại, mkfifosẽ tốt hơn một chút, mặc dù rất khó có khả năng bạn sẽ tìm thấy một unix hiện đại thực sự mknod ... pkhông hoạt động.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.