Was ist der Unterschied zwischen mkfifo() und mknod() beim Erstellen einer benannten Pipe?
Ich habe die Suche bemüht, aber keine zufriedenstellende Antwort erhalten.
Babybär
Was ist der Unterschied zwischen mkfifo() und mknod() beim Erstellen einer benannten Pipe?
Ich habe die Suche bemüht, aber keine zufriedenstellende Antwort erhalten.
Jonathan Leffler
Verwenden mkfifo()
ist standardisiert und portabel. Verwenden mknod()
ist im Allgemeinen nicht portabel – es ist ein Teil von POSIX (trotz einer gegenteiligen Aussage in einer früheren Version dieser Antwort). Das sagt die POSIX-Spezifikation mkfifo()
sollte bevorzugt werden. Ansonsten gibt es keinen Unterschied zwischen einem FIFO erstellt durch mkfifo()
und mknod()
.
Beachten Sie, dass mknod()
kann verwendet werden, um andere Gerätetypen als nur FIFOs zu erstellen. Es kann Block-Spezial- und Zeichen-Spezialgeräte erstellen. Es war einmal vor sehr (sehr, sehr) langer Zeit, mknod()
wurde auch zum Erstellen von Verzeichnissen verwendet – in den Tagen, bevor es eine gab mkdir()
oder rmdir()
Systemaufruf. Nach dem Erstellen des Verzeichnisses mussten Sie verwenden link()
zweimal, um die zu erstellen .
und ..
Einträge im neuen Verzeichnis. (Und Sie mussten Root-Rechte haben, um es zu benutzen, also die mkdir
und rmdir
Befehle waren SUID-Root.) Dateisysteme sind heutzutage viel zuverlässiger, weil das nicht mehr Teil des Spiels ist.
Referenz: Version 7 Unix – um 1979.
Ähm, mein mknod
manpage sagt «POSIX.1-2001 sagt: “Die einzige portable Verwendung von mknod()
ist das Erstellen einer FIFO-Spezialdatei. Wenn mode
ist nicht S_IFIFO
oder dev
ist nicht 0
das Verhalten von mknod()
ist nicht spezifiziert.”», so scheint es mknod
mit S_IFIFO
ist eigentlich Standard. Dies wird durch bestätigt pubs.opengroup.org/onlinepubs/9699919799/functions/mknod.htmlmit der Einschränkung, dass “The mkfifo()
Funktion wird dieser Funktion vorgezogen, um FIFO-Spezialdateien zu erstellen.”
– Matteo Italien
26. März 2017 um 0:19 Uhr
@MatteoItalia: Oh – hmm, danke. Da haben Sie recht mknod()
befindet sich in POSIX – sehr zu meiner Überraschung. Angesichts der Existenz von mkfifo()
(und mkdir()
und rmdir()
), ist die Funktion wirklich überflüssig; Ich bin überrascht, dass es standardisiert ist. Es ist merkwürdig, dass die Funktion in der Spezifikation mit einem nicht initialisierten Wert für das dritte Argument dargestellt wird: dev_t dev; int status = mknod("/home/cnd/mod_done", S_IFIFO | S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH, dev);
— dev
wird nicht als initialisiert angezeigt. Es auf 0 zu setzen wäre vernünftig; Es gab Worte in der 7. Ausgabe des Handbuchs, die darauf hindeuteten.
– Jonathan Leffler
26. März 2017 um 0:29 Uhr