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.
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)