Sind die von `mknod` erstellte Named Pipe und der von` mkfifo` erstellte FIFO gleichwertig?

22

Ich habe den mkfifo <file>Befehl verwendet, um benannte FIFOs zu erstellen, bei denen ein Prozess in die Datei schreibt und ein anderer Prozess aus der Datei liest.

Jetzt weiß ich, dass der mknodBefehl Named Pipes erstellen kann. Entsprechen diese Named Pipes den von erstellten FIFOs mkfifooder haben sie unterschiedliche Merkmale?

Shuzheng
quelle

Antworten:

29

Ja, es ist äquivalent, aber natürlich nur, wenn Sie mknodangeben, ein FIFO zu erstellen und kein Block- oder Zeichengerät (wird heutzutage nur noch selten von devtmpfs / udev für Sie ausgeführt).

mkfifo foobar
# same difference
mknod foobar p

In stracebeiden Befehlen ist es identisch:

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

Also in Bezug auf Syscalls, mkfifoist eigentlich eine Abkürzung für mknod.

Der größte Unterschied besteht also in der Semantik. Mit können mkfifoSie eine Reihe von FIFOs auf einmal erstellen:

mkfifo a b c

Mit mknod, da Sie den Typ angeben müssen, akzeptiert er immer nur ein Argument:

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

Im Allgemeinen mknodkann es schwierig sein, richtig zu verwenden. Wenn Sie also mit FIFO arbeiten möchten, bleiben Sie bei mkfifo.

Frostschutz
quelle
16
Während es das OP sicherlich nicht interessiert, da das Q nicht mit [linux] markiert ist, beachte, dass es sich bei BSD mkfifo(2) wirklich um einen separaten Systemaufruf handelt mknod(2)(aber am Ende wird es genau dasselbe tun wie mknod(S_FIFO)).
Mosvy
@frostschutz - vielen Dank für eine hervorragende Antwort. Also nur um die Dinge zu klären. mkfifound mknodsind tatsächlich Programme, die den mknodSystemaufruf verwenden (wussten vorher nicht von diesem Systemaufruf), um einen FIFO zu erstellen. Sie verwenden die Begriffe "FIFO" und "named" austauschbar, denke ich. Sind sie dasselbe? Bidirektionale Named Pipes werden über Unix-Domain-Sockets implementiert, oder?
Shuzheng
Ja, "named pipe" und FIFO beziehen sich normalerweise auf dasselbe (im Kontext von Pipes - FIFO ist ein Konzept , das auch außerhalb von Pipes existiert). Ein Socket ist ein ganz anderes Biest, einige interessante Antworten dazu hier: unix.stackexchange.com/q/75904/30851
frostschutz
@frostschutz - danke. Was mich wohl am meisten verwirrt hat, ist, dass ich bei Named Pipes auch an bidirektionale Pipes denke - und ein FIFO ist definitiv nicht bidirektional (AFAIK).
Shuzheng
@Shuzheng ein FIFO hat keine Regeln für die Richtung wirklich. Es ist wirklich nur lesen und schreiben. Es kann eine beliebige Anzahl von Lesern und Schreibern geben, aber alles, was geschrieben wurde, kann nur einmal gelesen werden, sodass unklar ist, wer am Ende die Daten erhalten würde.
Frostschutz
18

Sie sind bis auf die äußersten Ränder der Tragbarkeit gleichwertig. mknod ... pwar ursprünglich die einzige Möglichkeit, Named Pipes zu erstellen, aber POSIX hat sie weggelassen und mkfifostattdessen erfunden , vermutlich, weil Named Pipes ein von Natur aus portableres Konzept sind als alles, was andere Dinge mknodmit Geräten und ihren Haupt- und Nebenzahlen tun können. Der mknodSystemaufruf wurde auch in den frühen Versionen von POSIX nicht berücksichtigt.

Für die Portabilität auf das alte UNIX mknod ... pist es also besser. Für moderne Systeme mkfifoist es etwas besser, obwohl es ziemlich unwahrscheinlich ist, dass Sie ein aktuelles modernes Unix finden, bei dem mknod ... pes nicht funktioniert.


quelle