Diferencia entre mkfifo() y mknod()

2 minutos de lectura

avatar de usuario de babybear
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.

Avatar de usuario de Jonathan Leffler
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 de mknod() es crear un archivo especial FIFO. Si mode no es S_IFIFO o dev no es 0el comportamiento de mknod() no está especificado.”», por lo que parece que mknod con S_IFIFO es de hecho estándar. Esto es confirmado por pubs.opengroup.org/onlinepubs/9699919799/functions/mknod.htmlcon la salvedad de que “La mkfifo() 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 de mkfifo() (y mkdir() y rmdir()), 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

¿Ha sido útil esta solución?