bebe oso
¿Cuál es la diferencia entre mkfifo() y mknod() al crear una canalización con nombre?
Intenté buscar pero no pude obtener una respuesta satisfactoria.
jonathan leffler
Usando mkfifo()
es estandarizado y portátil. Usando mknod()
en general, no es portátil: es parte de POSIX (a pesar de una declaración en contrario en una versión anterior de esta respuesta). La especificación POSIX dice que mkfifo()
debe ser preferido. De lo contrario, no hay diferencia entre un FIFO creado por mkfifo()
y mknod()
.
Tenga en cuenta que mknod()
se puede usar para crear otros tipos de dispositivos que solo FIFO. Puede crear dispositivos especiales de bloque y de carácter especial. Érase una vez hace mucho (mucho, mucho) tiempo, mknod()
también se usaba para crear directorios; en los días previos a que existiera mkdir()
o rmdir()
llamada del sistema. Después de crear el directorio, tenía que usar link()
dos veces para crear el .
y ..
entradas en el nuevo directorio. (Y tenía que tener privilegios de root para usarlo, por lo que el mkdir
y rmdir
los comandos eran SUID root). Los sistemas de archivos son mucho más confiables hoy en día porque eso ya no es parte del juego.
Referencia: Versión 7 Unix – alrededor de 1979.
-
Uhm, mi
mknod
página de manual dice «POSIX.1-2001 dice: “El único uso portátil demknod()
es crear un archivo especial FIFO. Simode
no esS_IFIFO
odev
no es0
el comportamiento demknod()
no está especificado.”», por lo que parece quemknod
conS_IFIFO
es de hecho estándar. Esto es confirmado por pubs.opengroup.org/onlinepubs/9699919799/functions/mknod.htmlcon la salvedad de que “Lamkfifo()
Se prefiere esta función a esta función para crear archivos especiales FIFO.– Mateo Italia
26 de marzo de 2017 a las 0:19
-
@MatteoItalia: Oh, mmm, gracias. tienes razón en eso
mknod()
está en POSIX, para mi sorpresa. Dada la existencia demkfifo()
(ymkdir()
yrmdir()
), la función es realmente superflua; Me sorprende que esté estandarizado. Es curioso que la función se ilustre en la especificación con un valor no inicializado para el tercer argumento:dev_t dev; int status = mknod("/home/cnd/mod_done", S_IFIFO | S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH, dev);
—dev
no se muestra como inicializado. Establecerlo en 0 sería sensato; había palabrería en el manual de la séptima edición que sugería eso.–Jonathan Leffler
26 de marzo de 2017 a las 0:29