domingo, 7 de marzo de 2010

FCNTL

***********
SYS_fcntl
***********

NOMBRE
------------
fcntl - manipula el descriptor de fichero


SINOPSIS
------------
# 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);

DESCRIPCIÓN
------------------
fcntl es un acrónimo de 'file control'. Esta función permite llevar a cabo distintas
operaciones de control sobre descriptores de archivos.

F_DUPFD
Encuentra el número más bajo descriptor de archivo disponible superior o igual a arg y
hacer que sea una copia de fd. Esta es la forma diferente dup2 (2) que usa exactamente
el descriptor específico.

Los descriptores antiguo y nuevo pueden usarse indistintamente. Los bloqueos de acción, la
posición de los punteros de archivo y las banderas, por ejemplo, si la posición del archivo
es modificado mediante lseek en uno de los descriptores, la posición también se cambia para
el otro.

Los dos descriptores no comparten el primer plano de la bandera Exec, sin embargo. El primer
plano de la bandera exec de la copia está apagado, lo que significa que no se cerrará el exec.
En caso de éxito, se devuelve el nuevo descriptor.

F_GETFD
Leer el primer plano de la bandera Exec. Si el bit FD_CLOEXEC es 0, el archivo permanecerá
abierta acrossexec, de lo contrario será cerrado.

F_SETFD
Establecer el primer plano de la bandera exec para el valor especificado por el bit de
FD_CLOEXEC de arg.

.
.
.

Cada descriptor tiene un conjunto de flags que se obtiene utilizando la orden (parámetro cmd)
F_GETFL y que se obtienen utilizando la orden F_SETFL.


VALOR DEVUELTO
------------------------
Para una llamada con éxito, el valor de retorno depende de la operación:
F_DUPFD
El nuevo descriptor.

F_GETFD
Valor de la bandera.

F_GETFL
Valor de las banderas.

F_GETOWN
Valor del propietario del descriptor.

F_GETSIG
Valor de la señal enviada cuando la lectura o la escritura son posibles o cero para el
comportamiento SIGIO tradicionales.

Todos los otros comandos
Cero.

En caso de error, se devuelve -1, y errno se establece con el valor apropiado.


ERRORES
------------
EACCES o EAGAIN
La operación está prohibida por el bloqueo realizado por otros procesos. O bien, la operación
está prohibida porque el archivo ha sido ubicado en memoria por otro proceso.

EBADF
fd no es un descriptor de archivo abierto, o el comando se F_SETLK o F_SETLKW y el descriptor
de archivo de modo de apertura no coincide con el tipo de bloqueo solicitado.

EDEADLK
Se ha detectado que el comando especificado F_SETLKW causaría un callejón sin salida.

EFAULT
de bloqueo está fuera de su espacio de direcciones accesible.

EINTR
Para F_SETLKW, el comando fue interrumpida por una señal. Para F_GETLK y F_SETLK, la orden fue
interrumpida por una señal antes de que el bloqueo fue comprobado o adquirido. Lo más probable
es que el bloqueo de un archivo remoto (por ejemplo, el bloqueo a través de NFS), pero a veces
puede ocurrir a nivel local.

EINVAL
Para F_DUPFD, arg es negativo o es mayor que el valor máximo permitido. ForF_SETSIG, arg no es
un número de señal permitido.

EMFILE
Para F_DUPFD, el proceso ya tiene el número máximo de descriptores de archivos abiertos.

ENOLCK
Demasiado segmento muchas cerraduras, la tabla de bloqueo es completo, o un protocolo de bloqueo
remoto no se pudo (por ejemplo, el bloqueo a través de NFS).

EPERM
Intentó quitar la marca O_APPEND en un archivo que tiene el atributo de solo-agregar conjunto.


VER TAMBIÉN
------------------
dup2 (2), flock (2), lockf (3), open (2),
Toma (2) Véase también locks.txt, mandatory.txt, y dnotify.txt en / usr / src / linux /
Documentation.

REFERENCIA
----------------
http://www.opengroup.org/onlinepubs/009695399/functions/fcntl.html


EJEMPLO
------------
El siguiente ejemplo muestra cómo colocar un candado en los bytes 100 a 109 de un archivo y
luego eliminarlo. F_SETLK se utiliza para realizar una petición de no-bloqueo para que el
proceso no tenga que esperar si por si algún bloqueo incompatible está en manos de otro proceso,
por el contrario el proceso puede tomar alguna otra acción.

#include < stdlib.h >
#include < unistd.h >
#include < fcntl.h >
#include < errno.h >

int
main(int argc, char *argv[])
{
int fd;
struct flock fl;


fd = open("testfile", O_RDWR);
if (fd == -1)
/* Handle error */;


/* Make a non-blocking request to place a write lock
on bytes 100-109 of testfile */


fl.l_type = F_WRLCK;
fl.l_whence = SEEK_SET;
fl.l_start = 100;
fl.l_len = 10;


if (fcntl(fd, F_SETLK, &fl) == -1) {
if (errno == EACCES || errno == EAGAIN) {
printf("Already locked by another process\n");


/* We can't get the lock at the moment */


} else {
/* Handle unexpected error */;
}
} else { /* Lock was granted... */


/* Perform I/O on bytes 100 to 109 of file */


/* Unlock the locked bytes */


fl.l_type = F_UNLCK;
fl.l_whence = SEEK_SET;
fl.l_start = 100;
fl.l_len = 10;
if (fcntl(fd, F_SETLK, &fl) == -1)
/* Handle error */;
}
exit(EXIT_SUCCESS);
} /* main */


No hay comentarios:

Publicar un comentario