NOMBRE
mknod − crea un fichero especial o un fichero regular
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.
VÉASE TAMBIÉN
close(2), fcntl(2), mkdir(2), mount(2), open(2), read(2), socket(2), stat(2), umask(2), unlink(2), write(2), fopen(3), mkfifo(3)