Mknod tarafından oluşturulan adlandırılmış boru ve mkfifo eşdeğeri tarafından oluşturulan FIFO mu?


22

mkfifo <file>Komutu, bir işlemin dosyaya yazdığı ve başka bir işlemin dosyadan okuduğu FIFO adlarını oluşturmak için kullandım .

Şimdi, mknodkomutun adlandırılmış yöneltmeler oluşturabildiğini biliyorum . Bunlar adlandırılmış yöneltmeler tarafından oluşturulan FIFO'lara eşdeğer mi mkfifo, yoksa farklı özelliklere sahip mi?

Yanıtlar:


29

Evet, eşdeğerdir, ancak açıkçası yalnızca mknodaslında bir FIFO oluşturduğunuzu söylerseniz , bir blok veya karakter aygıtı değil (bu günlerde nadiren devtmpfs / udev sizin için yapar).

mkfifo foobar
# same difference
mknod foobar p

Her straceiki komut için de aynıdır:

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

Yani, sistemler açısından mkfifo, aslında kısacası mknod.

Öyleyse en büyük fark anlambilimdir. İle mkfifosize tek seferde FIFOların bir demet oluşturabilir:

mkfifo a b c

İle mknodEğer türünü belirtmek zorunda çünkü, bu sadece hiç bir argüman kabul eder:

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

Genel olarak, mknoddoğru kullanmak zor olabilir. Bu yüzden FIFO ile çalışmak istiyorsanız, buna bağlı kalın mkfifo.


16
OP kesinlikle umrunda olmasa da, Q [linux] etiketli olmadığı için, BSD'de mkfifo(2) gerçekten ayrı bir sistem çağrısı yapıldığına dikkat edin mknod(2)(ancak bununla aynı şeyi yapacaktır mknod(S_FIFO)).
mosvy

@frostschutz - mükemmel bir cevap için teşekkür ederim. Yani sadece şeyleri netleştirmek için. mkfifove mknodaslında mknodbir FIFO oluşturmak için sistem çağrısını (bugünden önce bu sistem çağrısını bilmiyordum) kullanan programlardır . Sanırım "FIFO" ve "adlı" terimlerini birbirlerinin yerine kullanıyorsunuz. Aynı şey mi? Çift yönlü adlandırılmış borular Unix alan soketleri vasıtasıyla uygulanır, değil mi?
Shuzheng

Evet, "adlandırılmış yöneltme" ve FIFO genellikle aynı şeyi ifade eder (borular bağlamında - FIFO, boruların dışında da var olan bir kavramdır ). Bir soket tamamen farklı bir canavardır, burada bazı ilginç cevaplar vardır: unix.stackexchange.com/q/75904/30851
frostschutz

@frostschutz - teşekkür ederim. Sanırım beni en çok karıştıran şey, adlandırılmış boruları düşündüğümde, ayrıca çift yönlü boruları düşündüğümdür - ve FIFO kesinlikle çift yönlü değildir (AFAIK).
Shuzheng,

@ Shuzheng bir FIFO'nun gerçekten yön konusunda herhangi bir kuralları yoktur. Gerçekten sadece oku ve yaz. Çok sayıda okuyucu ve yazar olabilir, ancak yazılan her şey yalnızca bir kez okunabilir, bu nedenle verileri kimin alacağı belirsizdir.
frostschutz

18

Aşırı taşınabilirlik kenarları dışında eşdeğerdirler. mknod ... pbaşlangıçta adlandırılmış yöneltmeler yaratmanın tek yolu buydu, ancak POSIX büyük mkfifoolasılıkla mknodaygıtların çıkarması ve büyük ve küçük sayılarla yapabileceği her şeyden daha doğal olarak daha taşınabilir bir kavram olduğu için POSIX tarafından atlanmayı ve bunun yerine icat etmeyi seçti . mknodSistem çağrısı da POSIX erken verions dışına bırakıldı.

Yani, eski UNIX'e taşınabilirlik için mknod ... pdaha iyidir. Modern sistemler mkfifoiçin biraz daha iyidir, ancak mknod ... pçalışmadığı yerde gerçek bir modern unix bulmanız pek olası değildir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.