Section: Manual del Programador de Linux (2)
Updated: 12 julio 1999
Index Return to Main
Contents
fcntl - manipula el descriptor de fichero
#include <unistd.h> #include <fcntl.h> int fcntl(int fd, int cmd); int fcntl(int fd, int cmd, long arg); int fcntl(int fd, int cmd, struct flock * lock);
realiza una de las diversas y variadas operaciones sobre fd. La operación en cuestión se determina mediante cmd:
Los descriptores antiguo y nuevo pueden usarse indistintamente. Ambos comparten candados (locks), indicadores de posición de ficheros y banderas (flags); por ejemplo, si la posición del fichero se modifica usando lseek en uno de los descriptores, la posición del otro resulta modificada simultáneamente.
Sin embargo, los dos descriptores no comparten la bandera close-on-exec "cerrar-al-ejecutar". La bandera close-on-exec de la copia está desactivada, significando que no se cerrará en ejecución.
En caso de éxito, se devuelve el nuevo descriptor.
Las banderas se comparten entre copias (hechas con dup(2), fork(2), etc.) del mismo descriptor de fichero.
Las banderas y su semántica están descritas en open(2). F_GETLK, F_SETLK y F_SETLKW se utilizan para gestionar candados de ficheros discrecionales (discretionary file locks). El tercer argumento lock es un puntero a una struct flock (que puede ser sobrescrita por esta llamada).
Los grupos de procesos se devuelven como valores negativos.
Los grupos de procesos se especifican mediante valores negativos. (Se puede usar F_SETSIG para especificar una señal diferente a SIGIO).
Si activa la bandera de estado O_ASYNC sobre un descriptor de fichero (tanto si proporciona esta bandera con la llamada open(2) como si usa la orden F_SETFL de fcntl), se enviará una señal SIGIO cuando sea posible la entrada o la salida sobre ese descriptor de fichero.
El proceso o el grupo de procesos que recibirá la señal se puede seleccionar usando la orden F_SETOWN de la función fcntl. Si el descriptor de fichero es un enchufe (socket), esto también seleccionará al recipiente de las señales SIGURG que se entregan cuando llegan datos fuera de orden (out-of-band, OOB) sobre el enchufe. (SIGURG se envía en cualquier situación en la que select(2) informaría que el enchufe tiene una "condición excepcional"). Si el descriptor de fichero corresponde a un dispositivo de terminal, entonces las señales SIGIO se envían al grupo de procesos en primer plano de la terminal.
Usando F_SETSIF con un valor distinto de cero y asignando SA_SIGINFO para el manejador de señal (vea sigaction(2)), se pasa información extra sobre los eventos de E/S al manejador en la estructura siginfo_t. Si el campo si_code indica que la fuente is SI_SIGIO, el campo si_fd proporciona el descriptor de fichero asociado con el evento. En caso contrario, no se indican qué descriptores de ficheros hay pendientes y, para determinar qué descriptores de fichero están disponibles para E/S, debería usar los mecanismos usuales (select(2), poll(2), read(2) con O_NONBLOCK activo, etc.).
Seleccionando una señal de tiempo real POSIX.1b (valor >= SIGRTMIN), se pueden encolar varios eventos de E/S usando los mismos números de señal. (El encolamiento depende de la memoria disponible). Se dispone de información extra si se asigna SA_SIGINFO al manejador de señal, como antes.
Usando estos mecanismos, un programa puede implementar E/S totalmente asíncrona, sin usar select(2) ni poll(2) la mayor parte del tiempo.
El uso de O_ASYNC, F_GETOWN y F_SETOWN es específico de Linux y BSD. F_GETSIG y F_SETSIG son específicos de Linux. POSIX posee E/S asíncrona y la estructura aio_sigevent para conseguir cosas similares; estas también están disponibles en Linux como parte de la biblioteca de C de GNU (GNU C Library, Glibc).
Para una llamada con éxito, el valor devuelto depende de la operación:
En caso de error el valor devuelto es -1, y se pone un valor apropiado en errno.
Los errores devueltos por dup2 son distintos de aquéllos dados por F_DUPFD.
SVID, AT&T, POSIX, X/OPEN, BSD 4.3. Sólo las operaciones F_DUPFD, F_GETFD, F_SETFD, F_GETFL, F_SETFL, F_GETLK, F_SETLK y F_SETLKW se especifican en POSIX.1. F_GETOWN y F_SETOWN son BSD-ismos no aceptados en SVr4; F_GETSIG y F_SETSIG son específicos de Linux. Las banderas legales para F_GETFL/F_SETFL son aquéllas que acepta open(2) y varían entre estos sistemas; O_APPEND, O_NONBLOCK, O_RDONLY y O_RDWR son las que se mencionan en POSIX.1. SVr4 admite algunas otras opciones y banderas no documentadas aquí.
SVr4 documenta las condiciones de error adicionales EIO, ENOLINK y EOVERFLOW.
(2), socket(2), dup2(2), flock(2).
This document was created by man2html, using
the manual pages.
Time: 06:16:20 GMT, January 22, 2005