Ja, es ist äquivalent, aber natürlich nur, wenn Sie mknod
angeben, 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 strace
beiden Befehlen ist es identisch:
mknod("foobar", S_IFIFO|0666) = 0
Also in Bezug auf Syscalls, mkfifo
ist eigentlich eine Abkürzung für mknod
.
Der größte Unterschied besteht also in der Semantik. Mit können mkfifo
Sie 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 mknod
kann es schwierig sein, richtig zu verwenden. Wenn Sie also mit FIFO arbeiten möchten, bleiben Sie bei mkfifo
.
mkfifo(2)
wirklich um einen separaten Systemaufruf handeltmknod(2)
(aber am Ende wird es genau dasselbe tun wiemknod(S_FIFO)
).mkfifo
undmknod
sind tatsächlich Programme, die denmknod
Systemaufruf 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?Sie sind bis auf die äußersten Ränder der Tragbarkeit gleichwertig.
mknod ... p
war ursprünglich die einzige Möglichkeit, Named Pipes zu erstellen, aber POSIX hat sie weggelassen undmkfifo
stattdessen erfunden , vermutlich, weil Named Pipes ein von Natur aus portableres Konzept sind als alles, was andere Dingemknod
mit Geräten und ihren Haupt- und Nebenzahlen tun können. Dermknod
Systemaufruf wurde auch in den frühen Versionen von POSIX nicht berücksichtigt.Für die Portabilität auf das alte UNIX
mknod ... p
ist es also besser. Für moderne Systememkfifo
ist es etwas besser, obwohl es ziemlich unwahrscheinlich ist, dass Sie ein aktuelles modernes Unix finden, bei demmknod ... p
es nicht funktioniert.quelle