Apakah pipa bernama dibuat oleh `mknod` dan FIFO dibuat oleh` mkfifo` setara?

22

Saya telah menggunakan mkfifo <file>perintah untuk membuat bernama FIFOs, di mana satu proses menulis ke file, dan proses lain membaca dari file.

Sekarang, saya tahu mknodperintahnya dapat membuat pipa bernama. Apakah pipa bernama ini setara dengan FIFO yang dibuat oleh mkfifo, atau apakah mereka memiliki fitur yang berbeda?

Shuzheng
sumber

Jawaban:

29

Ya, itu setara, tetapi jelas hanya jika Anda mengatakan mknoduntuk benar-benar membuat FIFO, dan bukan perangkat blok atau karakter (jarang dilakukan hari ini seperti devtmpfs / udev melakukannya untuk Anda).

mkfifo foobar
# same difference
mknod foobar p

Di stracedalamnya identik untuk kedua perintah:

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

Jadi dalam hal syscalls, mkfifosebenarnya adalah singkatan mknod.

Maka, perbedaan terbesar adalah dalam semantik. Dengan mkfifoAnda dapat membuat banyak FIFO dalam sekali jalan:

mkfifo a b c

Dengan mknod, karena Anda harus menentukan jenisnya, ia hanya menerima satu argumen:

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

Secara umum, mknodbisa jadi sulit digunakan dengan benar. Jadi jika Anda ingin bekerja dengan FIFO, tetap ikuti mkfifo.

frostschutz
sumber
16
sementara OP tentu tidak peduli, karena Q tidak ditandai [linux], perhatikan bahwa pada BSD mkfifo(2) sebenarnya adalah panggilan sistem yang terpisah dari mknod(2)(tapi itu akhirnya akan melakukan hal yang persis sama seperti mknod(S_FIFO)).
Mosvy
@frostschutz - terima kasih atas jawaban yang bagus. Jadi hanya untuk memperjelas hal-hal. mkfifodan mknodsebenarnya program menggunakan mknodpemanggilan sistem (tidak tahu pemanggilan sistem sebelum hari ini) untuk membuat FIFO. Anda menggunakan istilah "FIFO" dan "bernama" secara bergantian, saya kira. Apakah mereka sama? Pipa bernama dua arah diimplementasikan menggunakan soket domain Unix, bukan?
Shuzheng
Ya, "pipa bernama" dan FIFO biasanya merujuk pada hal yang sama (dalam konteks pipa - FIFO adalah konsep yang ada di luar pipa juga). Socket adalah binatang yang sama sekali berbeda, beberapa jawaban menarik untuk itu di sini: unix.stackexchange.com/q/75904/30851
frostschutz
@frostschutz - terima kasih. Saya kira yang paling membingungkan saya adalah, ketika saya berpikir tentang pipa bernama, saya juga memikirkan pipa dua arah - dan FIFO jelas bukan dua arah (AFAIK).
Shuzheng
@Shuzheng a FIFO benar-benar tidak memiliki aturan arah. Benar-benar hanya membaca dan menulis. Mungkin ada sejumlah pembaca dan penulis, tetapi apa pun yang ditulis hanya dapat dibaca sekali, jadi tidak jelas siapa yang akan mendapatkan data pada akhirnya.
frostschutz
18

Mereka setara kecuali di tepi ekstrim portabilitas. mknod ... ppada awalnya satu-satunya cara untuk membuat pipa bernama, tetapi POSIX memilih untuk menghilangkannya dan menciptakannya mkfifo, mungkin karena pipa bernama adalah konsep yang secara inheren lebih portabel daripada semua hal lain yang mknoddapat dilakukan dengan perangkat dan angka utama dan kecilnya. The mknodsystem call juga ditinggalkan dari verions awal POSIX.

Jadi, untuk portabilitas ke UNIX kuno, mknod ... plebih baik. Untuk sistem modern, mkfifoini sedikit lebih baik, meskipun sangat tidak mungkin Anda akan menemukan unix modern yang sebenarnya di mana mknod ... ptidak berfungsi.


sumber