Unterschied zwischen mkfifo() und mknod()

Lesezeit: 2 Minuten

Benutzeravatar von babybear
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.

Benutzeravatar von Jonathan Leffler
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 0das 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

1437310cookie-checkUnterschied zwischen mkfifo() und mknod()

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy