Le canal nommé créé par `mknod` et le FIFO créé par` mkfifo` sont-ils équivalents?

22

J'ai utilisé la mkfifo <file>commande pour créer des FIFO nommés, où un processus écrit dans le fichier et un autre processus lit le fichier.

Maintenant, je sais que la mknodcommande est capable de créer des canaux nommés. Ces canaux nommés sont-ils équivalents aux FIFO créés par mkfifoou ont-ils des fonctionnalités différentes?

Shuzheng
la source

Réponses:

29

Oui, c'est équivalent, mais évidemment seulement si vous dites mknodde créer réellement un FIFO, et non un périphérique de bloc ou de caractère (rarement fait de nos jours comme devtmpfs / udev le fait pour vous).

mkfifo foobar
# same difference
mknod foobar p

Dans stracec'est identique pour les deux commandes:

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

Donc, en termes d'appels système, mkfifoest en fait un raccourci pour mknod.

La plus grande différence réside donc dans la sémantique. Avec, mkfifovous pouvez créer un tas de FIFO en une seule fois:

mkfifo a b c

Avec mknod, puisque vous devez spécifier le type, il n'accepte qu'un seul argument:

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

En général, mknodpeut être difficile à utiliser correctement. Donc, si vous voulez travailler avec FIFO, respectez-le mkfifo.

frostschutz
la source
16
tandis que l'OP ne s'en soucie certainement pas, puisque le Q n'est pas étiqueté [linux], notez que sur BSD mkfifo(2) est vraiment un appel système distinct de mknod(2)(mais il finira par faire exactement la même chose que mknod(S_FIFO)).
mosvy
@frostschutz - merci pour une excellente réponse. Juste pour clarifier les choses. mkfifoet mknodsont en fait des programmes utilisant l' mknodappel système (ne connaissaient pas cet appel système avant aujourd'hui) pour créer un FIFO. Vous utilisez les termes «FIFO» et «nommé» de manière interchangeable, je suppose. S'agit-il de la même chose? Les canaux nommés bidirectionnels sont implémentés au moyen de sockets de domaine Unix, non?
Shuzheng
Oui, "pipe nommée" et FIFO se réfèrent généralement à la même chose (dans le contexte des pipes - FIFO est un concept qui existe également en dehors des pipes). Une socket est une bête complètement différente, quelques réponses intéressantes à cela ici: unix.stackexchange.com/q/75904/30851
frostschutz
@frostschutz - merci. Je suppose que ce qui m'a le plus dérouté, c'est que, quand je pense aux tuyaux nommés, je pense aussi aux tuyaux bidirectionnels - et un FIFO n'est certainement pas bidirectionnel (AFAIK).
Shuzheng
@Shuzheng a FIFO n'a pas vraiment de règles de direction. C'est vraiment juste lire et écrire. Il peut y avoir n'importe quel nombre de lecteurs et d'écrivains, mais tout ce qui est écrit ne peut être lu qu'une seule fois, il n'est donc pas clair qui obtiendrait les données à la fin.
frostschutz
18

Ils sont équivalents sauf aux extrémités extrêmes de la portabilité. mknod ... pétait à l'origine le seul moyen de créer des canaux nommés, mais POSIX a choisi de l'omettre et d'inventer à la mkfifoplace, probablement parce que les canaux nommés sont un concept intrinsèquement plus portable que tout ce que d'autres choses mknodpeuvent faire avec les appareils et leurs nombres majeurs et mineurs. L' mknodappel système a également été omis des premières versions de POSIX.

Donc, pour la portabilité vers l'ancien UNIX, mknod ... pc'est mieux. Pour les systèmes modernes, mkfifoc'est légèrement mieux, bien qu'il soit peu probable que vous trouviez un véritable Unix moderne où mknod ... pcela ne fonctionne pas.


la source