Provided by: manpages-es_1.55-10_all bug

NOMBRE

       open, creat - abren y posiblemente crean un fichero o dispositivo

SINOPSIS

       #include <sys/types.h>
       #include <sys/stat.h>
       #include <fcntl.h>

       int open(const char *camino, int flags);
       int open(const char *camino, int flags, mode_t modo);
       int creat(const char *camino, mode_t modo);

DESCRIPCIÓN

       La  llamada  al  sistema  open()  se  utiliza  para convertir una ruta en un descriptor de
       fichero (un pequeño  entero  no  negativo  que  se  utiliza  en  las  operaciones  de  E/S
       posteriores  como  en read, write, etc.).  Cuando la llamada tiene éxito, el descriptor de
       fichero devuelto será el descriptor de fichero más pequeño no abierto actualmente para  el
       proceso.   Esta  llamada  crea  un  nuevo  fichero  abierto, no compartido con ningún otro
       proceso. (Pero pueden aparecer ficheros abiertos compartidos a través  de  la  llamada  al
       sistema fork(2).)  El nuevo descriptor de fichero se configura para que permanezca abierto
       a través de funciones exec (vea fcntl(2)).  El apuntador de lectura/escritura del  fichero
       se configura para que apunte al principio del fichero.

       El  parámetro  flags es uno de O_RDONLY, O_WRONLY u O_RDWR que, respectivamente, piden que
       la apertura del fichero sea solamente para  lectura,  solamente  para  escritura,  o  para
       lectura  y escritura, combinándose mediante el operador de bits OR (|),  con cero o más de
       las siguientes macros:

       O_CREAT
              Si el fichero no existe, será creado.  El propietario  (identificador  de  usuario)
              del fichero se fija al identificador de usuario efectivo del proceso.  La propiedad
              del grupo (identificador de grupo) se fija bien al identificador de grupo  efectivo
              del  proceso o bien al identificador de grupo del directorio padre (dependiendo del
              tipo de sistema de ficheros y las opciones de montaje, y  el  modo  del  directorio
              padre, vea, p.e. las opciones de montaje bsdgroups y sysvgroups sobre el sistema de
              ficheros ext2, tal como se describen en mount(8)).

       O_EXCL Cuando se combina con O_CREAT, es un  error  que  el  fichero  ya  exista,  y  open
              fallará.  En este contexto, un enlace simbólico existe, sin tener en cuenta a donde
              apunte.  O_EXCL no funciona en sistemas de  ficheros  de  red  NFS,  programas  que
              confíen en él para efectuar tareas de bloqueo contendrán una condición de concurso.
              La solución para efectuar un bloqueo atómico de  fichero  mediante  un  fichero  de
              bloqueo  es  crear  un  fichero único en el mismo sistema de ficheros (por ejemplo,
              incorporando el nombre del ordenador y el PID) y utilizar  link(2)  para  hacer  un
              enlace al fichero de bloqueo. Si link() devuelve 0, el bloqueo tiene éxito. En caso
              contrario, use stat(2) en el fichero único para comprobar si su número  de  enlaces
              se ha incrementado a 2, en cuyo caso el bloqueo también tiene éxito.

       O_NOCTTY
              Si  camino se refiere a una terminal — vea tty(4) — no se convertirá en la terminal
              controladora del proceso ni en el caso de que el proceso no tenga ninguna.

       O_TRUNC
              Si el fichero ya existe y es un fichero regular  y  el  modo  de  apertura  permite
              escribir (p.e., es O_RDWR o O_WRONLY) será truncado a longitud 0.  Si el fichero es
              una FIFO o un fichero de dispositivo de terminal, la opción O_TRUNC es ignorada. En
              otro  caso  el efecto de O_TRUNC es indefinido.  (En muchas versiones de Linux será
              ignorado; en otras devolverá un error.)

       O_APPEND
              El fichero se abrirá en modo de sólo-añadir. Antes de cada escritura, el  apuntador
              del fichero es posicionado al final del fichero, como se haría con lseek.  O_APPEND
              puede conducir a ficheros corruptos en sistemas  de  ficheros  NFS  si  más  de  un
              proceso  añade datos a un fichero a la vez. Esto es así porque NFS no admite añadir
              a un fichero, así que el núcleo del cliente  ha  de  simularlo,  lo  que  no  puede
              hacerse sin una condición de carrera.

       O_NONBLOCK u O_NDELAY
              Cuando  ésto  es  posible,  el fichero se abre en modo no bloqueante. Ni el open ni
              ninguna operación subsecuente sobre el descriptor  de  fichero    que  es  devuelto
              harán que el proceso que hace la llamada espere.  Para el manejo de FIFOs (tuberías
              nombradas), vea también fifo(4).

       O_SYNC El fichero se abre para E/S síncrona. Cualesquiera operaciones de  escritura  write
              sobre el descriptor de fichero resultante bloquearán el proceso que ha efectuado la
              llamada hasta que los datos hayan  sido  físicamente  escritos  en  el  dispositivo
              subyacente.  Vea no obstante más abajo la sección RESTRICCIONES.

       O_NOFOLLOW
              Si  pathname  es  un  enlace  simbólico,  entonces  la  apertura falla. Ésta es una
              extensión de FreeBSD que fue añadida a Linux en la  versión  2.1.126.   Todavía  se
              seguirán  los  enlaces  simbólicos  de  los  componentes anteriores de la ruta. Los
              ficheros cabecera de la  versión  2.0.100  y  posteriores  de  glibc  incluyen  una
              definición  de  esta  opción;  los núcleos anteriores al 2.1.126 lo ignorarán si se
              usa.

       O_DIRECTORY
              Si pathname no es un directorio,  hará  que  la  apertura  falle.  Esta  opción  es
              específica  de  Linux  y  fue  añadida en la versión 2.1.126 del núcleo para evitar
              problemas de denegación de servicio  al  llamar  a  opendir(3)  sobre  una  FIFO  o
              dispositivo  de  cinta,  pero  no  se  debería  usar  fuera de la implementación de
              opendir.

       O_DIRECT
              Trata de minimizar los efectos de la caché de E/S a y desde el fichero.  En general
              ésto  empeorará el rendimiento, pero es útil en situaciones especiales, como cuando
              las  aplicaciones  poseen  su  propia  caché.   La  E/S  del  fichero  se   realiza
              directamente  a/desde  buffers  en  el  espacio de usuario.  La E/S es síncrona, es
              decir, cuando las llamadas al sistema read(2) o write(2)  finalizan,  se  garantiza
              que  los  datos  han  sido  transferidos.   Los  tamaños  de la transferencia, y el
              alineamiento del buffer de usuario y el desplazamiento del fichero deben ser  todos
              múltiplos del tamaño de bloque lógico del sistema de ficheros.
              Esta bandera está soportada en varios sistemas tipo Unix; el soporte para Linux fue
              añadido en la versión 2.4.10 del núcleo.
              Una interfaz semánticamente similar para los dispositivos de bloque se describe  en
              raw(8).

       O_ASYNC
              Genera  una  señal  (SIGIO  por  defecto,  pero se puede cambiar mediante fcntl(2))
              cuando la entrada o la salida se hace posible en este descriptor de fichero.   Esta
              característica   está   sólo   disponible  para  terminales,  pseudo-terminales,  y
              conectores. Vea fcntl(2) para más detalles..

       O_LARGEFILE
              En sistemas de 32 bits que soportan el `sistema de ficheros grandes'  (Large  Files
              System, LFS) permite abrir ficheros cuyos tamaños no pueden ser representados en 31
              bits.

       Algunos de estos modificadores opcionales pueden alterarse mediante  el  empleo  de  fcntl
       después de que el fichero haya sido abierto.

       El  argumento  modo  especifica  los  permisos  a  emplear en caso de que se cree un nuevo
       fichero. Es modificado por la máscara umask del proceso de la forma habitual: los permisos
       del  fichero  creado  son (modo & ~umask).  Observe que este modo sólo se aplica a futuros
       accesos del fichero recién creado; la llamada open que crea  un  fichero  de  solo-lectura
       puede devolver también un descriptor de fichero de lectura/escritura.

       Se proporcionan las siguientes constantes simbólicas para modo:

       S_IRWXU
              00700  el usuario (el propietario del fichero) tiene permisos de lectura, escritura
              y ejecución

       S_IRUSR (S_IREAD)
              00400 el usuario tiene permiso de lectura

       S_IWUSR (S_IWRITE)
              00200 el usuario tiene permiso de escritura

       S_IXUSR (S_IEXEC)
              00100 el usuario tiene permiso de ejecución

       S_IRWXG
              00070 el grupo tiene permiso de lectura, escritura y ejecución

       S_IRGRP
              00040 el grupo tiene permiso de lectura

       S_IWGRP
              00020 el grupo tiene permiso de escritura

       S_IXGRP
              00010 el grupo tiene permiso de ejecución

       S_IRWXO
              00007 los otros tienen permiso de lectura, escritura y ejecución

       S_IROTH
              00004 los otros tienen permiso de lectura

       S_IWOTH
              00002 los otros tienen permiso de escritura

       S_IXOTH
              00001 los otros tienen permiso de ejecución

       El argumento modo debe especificarse cuando O_CREAT está en flags, y si  no  está,  no  es
       tenido en cuenta.

       creat equivale a open con flags igual a O_CREAT|O_WRONLY|O_TRUNC.

VALOR DEVUELTO

       open  y  creat  devuelven el nuevo descriptor de fichero, o -1 si ha ocurrido un error (en
       cuyo caso, se da un valor apropiado a errno).  Observe  que  open  pueden  abrir  ficheros
       especiales de dispositivo, pero creat no puede crearlos; emplee mknod(2) en su lugar.

       En  sistemas  de  ficheros  NFS  con asociación de UIDs habilitada, open puede devolver un
       descriptor de fichero pero p. ej. llamadas a read(2) pueden denegarse con el error EACCES.
       Esto es así porque el cliente hace el open comprobando los permisos, pero la asociación de
       UID la hace el servidor sobre las peticiones de lectura y escritura.

       Si el fichero es recién creado, sus campos atime, ctime, mtime se  rellenan  con  la  hora
       actual,  al  igual que los campos ctime y mtime del directorio padre.  En otro caso, si el
       fichero es modificado a causa de la bandera O_TRUNC, sus campos ctime y mtime se  rellenan
       con la hora actual.

ERRORES

       EEXIST camino ya existe y se usaron O_CREAT y O_EXCL.

       EISDIR camino  se  refiere a un directorio y el acceso pedido implicaba escribir (esto es,
              O_WRONLY o O_RDWR estaban activos).

       EACCES El acceso pedido al fichero no es permitido, o uno de los directorios en camino  no
              tiene  permiso  de búsqueda o paso (ejecución), o el fichero todavía no existe y el
              directorio padre no tiene permiso de escritura.

       ENAMETOOLONG
              camino era demasiado largo.

       ENOENT O_CREAT no está activo y el fichero especificado no existe.  O bien,  un componente
              directorio  en  camino no existe o es un enlace simbólico colgante (que apunta a un
              fichero inexistente).

       ENOTDIR
              Un componente de camino empleado como un directorio no es, de hecho, un  directorio
              o se ha especificado la opción O_DIRECTORY y pathname no es un directorio.

       ENXIO  Se  ha seleccionado O_NONBLOCK | O_WRONLY, el fichero indicado es una FIFO y ningún
              proceso tiene el fichero abierto para lectura.  O el fichero es un fichero especial
              de dispositivo y no existe el dispositivo correspondiente.

       ENODEV pathname se refiere a un fichero especial de dispositivo y no existe el dispositivo
              correspondiente. (Éste es un fallo del  núcleo  de  Linux.  En  esta  situación  se
              debería devolver ENXIO.)

       EROFS  camino  se  refiere  a un fichero de un sistema de ficheros de sólo lectura y se ha
              pedido un acceso de escritura.

       ETXTBSY
              camino se refiere a una imagen ejecutable que se está ejecutando ahora mismo  y  se
              pidió un acceso de escritura.

       EFAULT camino apunta afuera de su espacio de direcciones accesible.

       ELOOP  Se  han  encontrado  demasiados  enláces  simbólicos  al  resolver  camino, o se ha
              especificado la opción O_NOFOLLOW pero pathname no es un enlace simbólico.

       ENOSPC camino iba a ser creado pero el dispositivo que lo  habría  de  contener  no  tiene
              espacio para el nuevo fichero.

       ENOMEM No hay disponible bastante memoria del núcleo.

       EMFILE El proceso ya tiene abiertos todos los ficheros que puede.

       ENFILE Se ha alcanzado el límite del número total de ficheros abiertos en el sistema.

CONFORME A

       SVr4,  SVID,  POSIX, X/OPEN, BSD 4.3 Las banderas O_NOFOLLOW y O_DIRECTORY son específicas
       de Linux.  Para obtener sus definiciones es necesario definir la macro _GNU_SOURCE.

RESTRICCIONES

       Hay muchas impropiedades en el protocolo subyacente a NFS, afectando entre otros a  O_SYNC
       y   a   O_NDELAY.    POSIX   proporciona   tres  variantes  diferentes  de  E/S  síncrona,
       correspondientes a las opciones O_SYNC, O_DSYNC y O_RSYNC.   Actualmente  (2.1.130)  todas
       ellas son sinónimas en Linux.

VÉASE TAMBIÉN

       read(2),  write(2),  fcntl(2),  close(2),  link(2), mknod(2), mount(2), stat(2), umask(2),
       unlink(2), socket(2), fopen(3), fifo(4)