SINOPSIS
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int mknod(const char *pathname, mode_t mode, dev_t dev);
DESCRIPCIÓN
mknod intenta crear en el sistema de ficheros un nodo-i (fichero, fichero especial de dispositivo o tubería nombrada (FIFO)) llamado pathname, especificado por mode y dev. mode especifica tanto los permisos de uso como el tipo de nodo-i a crear. Debe ser una combinación (mediante un O-lógico) de uno de los tipos de ficheros enumerados a continuación y de los permisos para el nuevo nodo-i. Los permisos son modificados por la máscara umask en la forma usual: los permisos del nodo-i creado son (mode & ~umask).El tipo de fichero debe ser uno de los siguientes: S_IFREG, S_IFCHR, S_IFBLK y S_IFIFO para especificar un fichero normal (que será creado vacío), un fichero especial de caracteres, un fichero especial de bloques o FIFO (tubería con nombre), respectivamente, o cero, lo que creará un fichero normal.
Si el tipo de fichero es S_IFCHR o S_IFBLK entonces dev especifica los números mayor y menor del fichero especial de dispositivo creado; en caso contrario, es ignorado.
Si pathname ya existe, o es un enlace simbólico, esta llamada fallará devolviendo el error EEXIST.
El identificador efectivo de usuario del proceso indica el propietario del nuevo nodo-i. Si el directorio que contiene al nodo-i tiene activo el bit de SETGID (fijar identifcador de grupo) o si el sistema de ficheros es montado con la semántica de grupos de BSD, el nuevo nodo heredará la pertenencia al grupo al que pertenezca su directorio padre; en caso contrario, pertenecerá al grupo indicado por el identificador efectivo de grupo del proceso.
VALOR DEVUELTO
mknod devuelve cero si ha funcionado correctamente, -1 si ha ocurrido un error (en cuyo caso se asigna a errno un valor apropiado).ERRORES
- EPERM
- mode solicita la creación de algo distinto a una tubería con nombre (FIFO), y el invocador no es el superusuario; este error también se devuelve si el sistema de ficheros que contiene pathname no soporta el tipo de nodo-i solicitado.
- EINVAL
- mode solicita la creación de algo diferente a un fichero normal, un fichero especial de dispositivo o una FIFO.
- EEXIST
- pathname ya existe.
- EFAULT
- pathname apunta fuera de su espacio de direcciones permitido.
- EACCES
- El proceso no tiene permiso de escritura en el directorio padre o no tiene permiso de búsqueda (ejecución) en uno de los directorios incluidos en pathname.
- ENAMETOOLONG
- pathname es demasiado largo.
- ENOENT
- Un directorio componente de pathname no existe o es un enlace simbólico descolgado.
- ENOTDIR
- Un componente utilizado como directorio en pathname no es, de hecho, un directorio.
- ENOMEM
- No hay suficiente memoria disponible en el núcleo.
- EROFS
- pathname indica un fichero en un sistema de ficheros de sólo-lectura.
- ELOOP
- Se han encontrado demasiados enlaces simbólicos al resolver pathname.
- ENOSPC
- El dispositivo que contiene pathname no tiene espacio para el nuevo nodo-i.
CONFORME A
SVr4 (pero la llamada requiere privilegios y por esto no es POSIX), 4.4BSD. La versión Linux difiere de la SVr4 en que no requiere permisos de superusuario para crear tuberías, y también en que los errores EMULTIHOP, ENOLINK, o EINTR no están documentados.OBSERVACIONES
POSIX 1003.1-2001 dice: "El único uso portable de mknod() es para crear un fichero especial de tipo FIFO. Si mode es distinto de S_IFIFO o dev es distinto de 0, el comportamiento de mknod() es indefinido."Bajo Linux, esta llamada no puede usarse para crear ficheros de tipo directorio o de tipo conector, y no puede ser utilizada por otro usuario que no sea el superusuario para crear ficheros normales. Para crear directorios use mkdir, y para crear FIFOs use mkfifo.
Existen numerosas pegas en el protocolo por debajo de NFS. Algunas de estas afectan a mknod.