Linguaggio C - fcntl()

NOME

fcntl() - manipola il file descriptor

SINOPSI

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

DESCRIZIONE

La funzione fcntl() esegue un operazione su fd determinata da cmd

cmd Significato
F_DUPFD Crea arg come come copia di fd, chiudendo prima il nuovo file descriptor se e' necessario.

La stessa funzionalita' puo' essere ottenuta con la funzione dup2()

Il vecchio e nuovo file descriptors possono essere utilizzati interscambiabilmente. Condividono locks, file position e flags.
Per esempio se il file position viene modificato attraverso lseek() su uno dei descrittori, la posizione viene modificata anche per l'altro.

I due descrittori non condividono il flag close-on-exec. Il flag close-on-exec della copia e' ad off (significa che il file descriptor puo' venire chiuso su un exec()).

In caso di successo viene tornato il nuovo descrittore.

F_GETFD Legge il flag close-on-exec.
Se il bit FD_CLOEXEC e' a 0, il file puo' rimanere apero con la chiamata ad exec(), altrimenti verra' chiuso.
F_SETFD Imposta il flag close-on-exec al valore specificato dal bit FD_CLOEXEC di arg.
F_GETFL Legge i flags del file descriptor.
Sono ritornati tutti i flags come sono settati dalla funzione open().
F_SETFL Imposta i flags del file descriptor al valore specificato da arg.
Solamente O_APPEND, O_NONBLOCK e O_ASYNC possono essere impostati.

F_GETLK, F_SETLK e F_SETLKW sono usati per gestire il file locks.
Il terzo argomento lock e' un puntatore a struct flock (che potrebbe essere sovrascritto da questa chiamata).
cmd Significato
F_GETLK Ritorna la struttura flock che ci impedisce di ottenere il lock, oppure imposta il campo l_type di lock al F_UNLCK se non ci sono impedimenti.
F_SETLK Il lock e' settato (quando l_type e' F_RDLCK o F_WRLCK) o cancellato (quando l_type e' F_UNLCK).
Se il lock e' mantenuto da qualcun'altro, viene ritornato -1 e errno vale EACCES o EAGAIN.
F_SETLKW Come F_SETLK, ma invece di ritornare un errore, viene atteso per il lock da essere rilasciato.
Se viene ricevuto un segnale da essere manipolato, mentre fcntl() sta' aspettando, fcntl() viene interrotta e, dopo che la gestione del segnale (signal handler) ha terminato, fcntl() ritorna immediatamente con valore -1 ed errno valorizzato a EINTR.

F_GETOWN, F_SETOWN, F_GETSIG e F_SETSIG sono usate per gestire la disponibilita' dei segnali di I/O.
cmd Significato
F_GETOWN Acquisisce il process ID o il process group che correntemente ricevono i segnali SIGIO e SIGURG per eventi sul file descriptor fd. I process groups sono ritornati come valori negativi.
F_SETOWN Imposta il process ID o il process group che potra' recevere i segnali SIGIO e SIGURG per eventi sul file descriptor fd.
I process groups sono specificati usando valori negativi. (F_SETSIG puo' essere usato per specificare un diverso segnale invece di SIGIO).

Se sul file descriptor viene impostato il flag O_ASYNC (o impostando il flag con la chiamata della funzione open(), o impiegando il copmando F_SETFL di fcntl()), un segnale SIGIO e' spedito ognivolta che l'input o l'output diventano possibili sul file descriptor.

Il processo o process group che ricevono il segnale possono essere selezionati utilizzando il comando F_SETOWN della funzione fcntl().
Se il file descriptor e' uno socket, questo anche seleziona il ricevente del segnale SIGURG che sono inviati quando i dati out-of-band arrivono sul socket.
SIGURG e' spedito in ciascuna situazione dove select() potrebbe riportare il socket ad avere una "exceptional condition".
Se il file descriptor corrisponde a un terminale, allora il segnale SIGIO e' spedito al gruppo del processo in foreground sul terminale.

F_GETSIG Acquisisce il segnale inviato quando l'input o l'output diventano possibili.
Un valore di 0 significa che SIGIO e' inviato.
Ciascun altro valore (incluso SIGIO) e' invece il segnale inviato, e informazioni aggiuntive potrebbero essere disponibili al signal handler con SA_SIGINFO.
F_SETSIG Imposta il segnale inviato quando l'input o l'output diventano possibili.
Un valore 0 significa di spedire il segnale di default SIGIO. Ciascun altro valore (incluso SIGIO) indica il segnale da inviare con disponibilita' di informazioni addizionali al signal handler se installate con SA_SIGINFO.

Impiegando F_SETSIG con un valore non 0, e settando SA_SIGINFO per il signal handler con sigaction(), informazioni aggiuntive sugli eventi di I/O sono passate all'handler in una struttura siginfo_t.
Se il campo si_code indica che l'origine e' SI_SIGIO, il campo si_fd fornisce il file descriptor associato con l'evento. Altrimenti non c'e' indicazione di quale file descriptor e' in attesa e per risalire al file descriptor occorre procedere nel meccanismo usuale tramite select(), poll() read() con O_NONBLOCK impostato, ecc.

Selezionando un segnale real time POSIX.1b (valore >= SIGRTMIN), multipli eventi I/O possono essere accodati usando lo stesso numero di segnale. (L'accodamento dipende dalla memoria disponibile). Informazioni aggiuntive sono disponibili se SA_SIGINFO e' settato per il signal handler, come detto precedentemente.

Con l'uso di questi meccanismi, un programma puo' implementare un completo I/O asincrono, senza impiegare il piu' delle volte le funzioni select() o poll().

L'uso di alcuni comandi e' "Linux-dipendente", occhio quindi al porting dei programmi.
Per maggiori dettagli consiglio uno sguardo alle 'man pages'.

VALORE DI RITORNO

La funzione fcntl() ritorna in caso di successo un valore dipendente dall'operazione, secondo lo schema seguente:
F_DUPFD Il nuovo file descriptor.
F_GETFD Valore dei flags.
F_GETFL Valore dei flags.
F_GETOWN Valore del proprietario.
F_GETSIG Valore del segnale inviato quando diventano possibili le operazioni di read o write, oppure 0 per il comportamento usuale di SIGIO
Tutti gli altri comandi 0
In caso di errore viene ritornato -1 e errno e' settato in modo appropriato.

CONFORME A

SVr4, SVID, POSIX, X/OPEN, BSD 4.3.
Tuttavia i comandi cmd disponibili sono in funzione della implementazione. Per maggiori dettagli consultare le 'man pages'.

VEDI ANCHE

open(), creat() lseek() read() write() close() link() symlink() unlink() stat(), lstat(), fstat() fcntl() ioctl() dup(), dup2() access()


Indice-C Indice linguaggio C
Indice librerie Indice librerie C
At Home Umberto Zappi Home Page
Indice funzioni Indice funzioni C