¿La tubería nombrada es creada por `mknod` y la FIFO creada por` mkfifo` equivalente?

22

He usado el mkfifo <file>comando para crear FIFO con nombre, donde un proceso escribe en el archivo y otro proceso lee del archivo.

Ahora, sé que el mknodcomando puede crear tuberías con nombre. ¿Son equivalentes estas canalizaciones con nombre a los FIFO creados por mkfifo, o tienen características diferentes?

Shuzheng
fuente

Respuestas:

29

Sí, es equivalente, pero obviamente solo si le dice mknodque 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 stracees idéntico para ambos comandos:

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

Entonces, en términos de syscalls, en mkfiforealidad es la abreviatura de mknod.

La mayor diferencia, entonces, está en la semántica. Con mkfifousted 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, mknodpuede ser difícil de usar correctamente. Entonces, si desea trabajar con FIFO, quédese mkfifo.

Frostschutz
fuente
16
mientras que al OP ciertamente no le importa, ya que la Q no está etiquetada [linux], mkfifo(2) tenga en cuenta que en BSD realmente es una llamada al sistema separada mknod(2)(pero terminará haciendo exactamente lo mismo mknod(S_FIFO)).
mosvy
@frostschutz: gracias por una excelente respuesta. Tan solo para aclarar las cosas. mkfifoy en mknodrealidad son programas que usan la mknodllamada 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?
Shuzheng
Sí, "tubería con nombre" y FIFO generalmente se refieren a lo mismo (en el contexto de las tuberías: FIFO es un concepto que también existe fuera de las tuberías). Un zócalo es una bestia completamente diferente, algunas respuestas interesantes a eso aquí: unix.stackexchange.com/q/75904/30851
frostschutz
@frostschutz - gracias. Supongo que lo que más me confundió es que, cuando pienso en tuberías con nombre, también pienso en tuberías bidireccionales, y un FIFO definitivamente no es bidireccional (AFAIK).
Shuzheng
@Shuzheng a FIFO no tiene reglas de dirección realmente. Realmente es solo leer y escribir. Puede haber cualquier cantidad de lectores y escritores, pero cualquier cosa escrita solo se puede leer una vez, por lo que no está claro quién obtendría los datos al final.
frostschutz
18

Son equivalentes excepto en los extremos de la portabilidad. mknod ... pOriginalmente era la única forma de crear tuberías con nombre, pero POSIX decidió omitirlo e inventarlo mkfifo, presumiblemente porque las tuberías con nombre son un concepto inherentemente más portátil que todo lo que otras cosas mknodpueden hacer con los dispositivos y sus números mayores y menores. La mknodllamada al sistema también quedó fuera de las primeras versiones de POSIX.

Entonces, para la portabilidad a UNIX antiguo, mknod ... pes mejor. Para los sistemas modernos, mkfifoes un poco mejor, aunque es bastante improbable que encuentre un Unix moderno real donde mknod ... pno funcione.


fuente