Sí, es equivalente, pero obviamente solo si le dice mknod
que cree realmente un FIFO, y no un dispositivo de bloque o de caracteres (rara vez se hace en estos días, ya que devtmpfs / udev lo hace por usted).
mkfifo foobar
# same difference
mknod foobar p
En strace
es idéntico para ambos comandos:
mknod("foobar", S_IFIFO|0666) = 0
Entonces, en términos de syscalls, en mkfifo
realidad es la abreviatura de mknod
.
La mayor diferencia, entonces, está en la semántica. Con mkfifo
usted puede crear un montón de FIFO de una vez:
mkfifo a b c
Con mknod
, dado que debe especificar el tipo, solo acepta un argumento:
# wrong:
$ mknod a b c p
mknod: invalid major device number ‘c’
# right:
mknod a p
mknod b p
mknod c p
En general, mknod
puede ser difícil de usar correctamente. Entonces, si desea trabajar con FIFO, quédese mkfifo
.
mkfifo(2)
tenga en cuenta que en BSD realmente es una llamada al sistema separadamknod(2)
(pero terminará haciendo exactamente lo mismomknod(S_FIFO)
).mkfifo
y enmknod
realidad son programas que usan lamknod
llamada del sistema (no sabía de esa llamada del sistema antes de hoy) para crear una FIFO. Usas los términos "FIFO" y "named" indistintamente, supongo. ¿Son la misma cosa? Las canalizaciones con nombre bidireccionales se implementan mediante sockets de dominio Unix, ¿verdad?Son equivalentes excepto en los extremos de la portabilidad.
mknod ... p
Originalmente era la única forma de crear tuberías con nombre, pero POSIX decidió omitirlo e inventarlomkfifo
, presumiblemente porque las tuberías con nombre son un concepto inherentemente más portátil que todo lo que otras cosasmknod
pueden hacer con los dispositivos y sus números mayores y menores. Lamknod
llamada al sistema también quedó fuera de las primeras versiones de POSIX.Entonces, para la portabilidad a UNIX antiguo,
mknod ... p
es mejor. Para los sistemas modernos,mkfifo
es un poco mejor, aunque es bastante improbable que encuentre un Unix moderno real dondemknod ... p
no funcione.fuente