fcntl, dup o dup2 Sottoroutine
Finalità
Controlla i descrittori di file aperti.
Libreria
Libreria C standard (libc.a)
Libreria di compatibilità Berkeley (libbsd.a) (per la sottoroutine fcntl )
Sintassi
#include <fcntl.h>
int fcntl ( FileDescriptor, Command, Argument) int FileDescriptor, Command, Argument;
#include <unistd.h>
int dup2( Vecchio, Nuovo) int Vecchio, Nuovo;
int dup( FileDescriptor) int FileDescriptor;
Descrizione
La sottoroutine fcntl effettua operazioni di controllo sul file aperto specificato dal parametro FileDescriptor . Se Network File System (NFS) è installato sul sistema, il file aperto può risiedere su un altro nodo. La sottoroutine fcntl è utilizzata per:
- Duplicati dei descrittori di file aperti.
- Impostare e ottenere le bandiere descrittori del file.
- Impostare e ottenere le bandiere di stato del file.
- Gestire i blocchi record.
- Gestire la proprietà I/O asincrona.
- Chiudere più file.
La sottoroutine fcntl può fornire le stesse funzioni delle subroutine dup e dup2 .
Se FileDescriptor fa riferimento a una periferica terminale o a un socket, è possibile utilizzare le funzioni I/O asincrone. Queste strutture sono normalmente abilitate utilizzando la sottoroutine ioctl con i comandi FIOASYNC, FIOSETOWNe FIOGETOWN . Tuttavia, è disponibile anche un meccanismo compatibile con BSD, se l'applicazione è collegata alla libreria libbsd.a .
Quando il parametro FileDescriptor fa riferimento a un oggetto di memoria condivisa, la sottoroutine fcntl gestisce solo comandi F_DUPFD, F_DUP2FD, F_GETFD, F_SETFD, F_GETFLe F_CLOSEM .
Quando si utilizza la libreria libbsd.a , l'I/O asincrono viene abilitato utilizzando il comando F_SETFL con l'indicatore FASYNC impostato nel parametro Argomento . I comandi F_GETOWN e F_SETOWN ottengono l'attuale proprietario I/O asincrono e impostano il proprietario I/O asincrono. Tuttavia, questi comandi sono validi solo quando il descrittore di file si riferisce ad un dispositivo terminale o a un socket.
Tutte le applicazioni contenenti la sottoroutine fcntl devono essere rispettate _BSD impostate su un valore specifico. I valori accettabili sono 43 e 44. Inoltre, tutte le applicazioni socket devono includere la libreria BSD libbsd.a .
Informazioni Generali di blocco dei record
Un blocco è un applicato o blocco consultivo e un leggi o un blocco di scrittura.
Attenzione: Buffered I/O non funziona correttamente se utilizzato con il blocco dei file. Non utilizzare le routine del pacchetto I/O standard sui file che verranno bloccati.
Per un blocco da bloccare è necessario impostare l'attributo Locking Locking del file; ad esempio, il bit S_ENFMT deve essere impostato, ma i bit S_IXGRP, S_IXUSRe S_IXOTH devono essere chiari. In caso contrario, il blocco è un blocco consultivo. Un determinato file può avere blocchi di consulenza o forzati, ma non entrambi. La descrizione del file sys/mode.h include una descrizione degli attributi del file.
Quando un processo detiene una serratura forzata su una sezione di un file, nessun altro processo può accedere a quella sezione del file con la sottoroutine leggi o scrivere . Inoltre, le subroutine aperto e ftroncato non possono troncare la sezione bloccata del file e la sottoroutine fchiara non può modificare la sezione bloccata del file. Se un altro processo tenta di leggere o modificare la sezione bloccata del file, il processo dorme fino a quando la sezione non viene sbloccata o ritorna con un'indicazione di errore.
Quando un processo detiene un blocco consultivo su una sezione di un file, nessun altro processo può bloccare quella sezione del file (o una sezione sovrapposta) con la sottoroutine fcntl . (Non sono interessate altre subroutine). Di conseguenza, i processi devono richiamare volontariamente la sottoroutine fcntl al fine di rendere efficaci i blocchi di consulenza.
Quando un processo congela un blocco di lettura su una sezione di un file, altri processi possono anche impostare blocchi di lettura su quella sezione o su sottoinsiemi di esso. I blocchi di lettura sono chiamati anche blocchi condiviso .
Una serratura di lettura impedisce qualsiasi altro processo dall'impostazione di un blocco di scrittura su qualsiasi parte dell'area protetta. Se il blocco di lettura è anche una serratura forzata, nessun altro processo può modificare l'area protetta.
Il descrittore di file su cui si trova una serratura di lettura deve essere stato aperto con accesso di lettura.
Quando un processo congela un blocco di scrittura su una sezione di un file, nessun altro processo può impostare un blocco di lettura o un blocco di scrittura su quella sezione. I blocchi di scrittura sono anche detti esclusiva blocchi. Solo un blocco di scrittura e nessun lucchetto di lettura può esistere per una specifica sezione di un file in qualsiasi momento.
Se la serratura è anche una serratura forzata, nessun altro processo può leggere o modificare l'area protetta.
Si applicano le seguenti regole generali relative al blocco dei file:
- La modifica o sblocco parte di un file in mezzo a una sezione bloccata lascia due sezioni minori bloccabili ad ogni fine della sezione originariamente bloccata.
- Se il processo di chiamata detiene un blocco su un file, tale blocco può essere sostituito da chiamate successive alla sottoroutine fcntl .
- Tutti i blocchi associati ad un file per un determinato processo vengono rimossi quando il processo chiude il descrittore file qualsiasi per quel file.
- I blocchi non vengono ereditati da un processo child dopo l'esecuzione di una sottoroutine forcella .Nota: Deadlock dovuti a blocchi di file in un sistema distribuito non vengono sempre rilevati. Quando tali deadlock possono eventualmente verificarsi, i programmi che richiedono i blocchi dovrebbero impostare dei timer di timeout.
I blocchi possono iniziare ed estendersi oltre la fine corrente di un file ma non possono essere negativi rispetto all'inizio del file. Un blocco può essere impostato per estendersi alla fine del file impostando ill_lencampo a 0. Se un tale blocco ha anche lal_startel_whencecampi impostati su 0, l'intero file è bloccato. Glil_len,l_starte adl_whencei campi di blocco fanno parte della struttura flock .
Quando un'applicazione blocca una regione di un file utilizzando l'interfaccia di blocco 32 bit (F_SETLK) e l'ultimo byte della gamma di blocco include MAX_OFF (2 Gb - 1), l'intervallo di blocco per la richiesta di sblocco sarà esteso per includere MAX_END (2 ^ ^ 63 - 1).
Parametri
| Elemento | Descrizione |
|---|---|
| FileDescriptor | Specifica un descrittore di file aperto ottenuto da una chiamata di successo alla sottoroutine aperto , alla subroutine fcntl , alla subroutine pipe o alla subroutine shm_open . I descrittori di file sono piccoli numeri interi positivi utilizzati (invece nomi offili) per identificare i file o un oggetto di memoria condivisa. |
| Argomento | Specifica una variabile il cui valore imposta la funzione specificata dal parametro Comando . Quando si tratta di blocchi di file, il parametro Argomento deve essere un puntatore alla struttura FLOCK . |
| Comando | Specifica l'operazione eseguita dalla subroutine fcntl . La sottoroutine fcntl può duplicare i descrittori di file aperti, impostare gli indicatori del file - descrittore, set blocchi descrittori di file, impostare ID di processoe chiudi descrittori di file aperti. |
Duplicazione Descrittori File
| Elemento | Descrizione |
|---|---|
| F_DUPFD | Restituisce un nuovo descrittore di file come segue:
|
Impostazione File - Indicatori Descrittori
| Elemento | Descrizione |
|---|---|
| F_GETFD | Richiama l'indicatore close - on - exec (bitFD_CLOEXEC ) associato al descrittore file specificato dal parametro FileDescriptor . Il parametro Argomento viene ignorato. Gli indicatori descrittori di file sono associati ad un singolo descrittore di file e non interessano gli altri associati allo stesso file. |
| F_SETFD | Assegna il valore del parametro Argomento all'indicatore close - on - exec (bitFD_CLOEXEC ) associato al parametro FileDescriptor . Se il valore di indicatore FD_CLOEXEC è 0, il file rimane aperto su qualsiasi chiamata a exec subroutine; in caso contrario, il file si chiuderà all'esecuzione riuscita di una sottoroutine exec . |
| F_GETFL | Richiama gli indicatori di stato file e le modalità di accesso file per la descrizione file aperta associata al descrittore file specificato nel parametro FileDescriptor . La descrizione del file aperto viene impostata nel momento in cui il file viene aperto e si applica solo a quei descrittori di file associati a quella particolare chiamata al file. Questo descrittore di file aperto non riguarda altri descrittori di file che si riferiscono allo stesso file con descrizioni di file aperti diverse. Gli indicatori di stato del file hanno i seguenti valori:
Le modalità di accesso al file hanno i seguenti valori:
Gli indicatori di accesso al file possono essere estratti dal valore di ritorno utilizzando la maschera O_ACCMODE , definita in fcntl.h . |
| F_SETFL | Imposta gli indicatori di stato del file dai corrispondenti bit specificati dal parametro Argomento . Gli indicatori di stato file sono impostati per la descrizione file aperta associata al descrittore file specificato dal parametro FileDescriptor . Possono essere impostate le seguenti bandiere:
Le bandiere O_NDELAY e O_NONBLOCK influenzano solo le operazioni contro i descrittori di file derivati dalla stessa sottoroutine aperto . In BSD queste operazioni si applicano a tutti i descrittori di file che fanno riferimento all'oggetto. |
Impostazione Blocchi File
| Elemento | Descrizione |
|---|---|
| F_GETLK | Ottiene informazioni sul primo blocco che blocca il blocco descritto nella struttura flock . Il parametro Argomento deve essere un puntatore a un tipo struct flock, come definito nel file flock.h . Le informazioni richiamate dalla sottoroutine fcntl sovrascrivono le informazioni nella struct flock puntate dal parametro Argomento . Se non viene trovato alcun blocco che impedisca che questo blocco venga creato, la struttura viene lasciata invariata, tranne che per il tipo di blocco (l_type) che è impostato su F_UNLCK. |
| F_SETLK | Imposta o cancella un blocco di segmento file in base alla descrizione di blocco puntata dal parametro Argomento . Il parametro Argomento deve essere un puntatore ad un tipo struct flock, definito nel file flock.h . L'opzione F_SETLK viene utilizzata per stabilire i blocchi di lettura (o condivisi) (F_RDLCK) o le blocchi di scrittura (o esclusive) (F_WRLCK), nonché per rimuovere o per rimuovere il tipo di blocco (F_UNLCK). I tipi di blocco sono definiti dal file fcntl.h . Se non è possibile impostare un blocco condiviso o esclusivo, la sottoroutine fcntl ritorna immediatamente. |
| F_SETLKW | Esegue la stessa funzione dell'opzione F_SETLK a meno che un blocco di lettura o scrittura non venga bloccato da blocchi esistenti, nel qual caso il processo dorme fino a quando la sezione del file non è libera da bloccare. Se un segnale da catturare viene ricevuto mentre la subroutine fcntl è in attesa di una regione, la subroutine fcntl viene interrotta, restituisce un -1 e imposta la variabile globale errno su EINTR. L'operazione di blocco non è effettuata. |
| Elemento | Descrizione |
|---|---|
| F_GETLK64 | Ottiene informazioni sul primo blocco che blocca il blocco descritto nella struttura flock64 . Il parametro Argomento deve essere un puntatore a un oggetto di tipo struct flock64, come definito nel file flock.h . Le informazioni richiamate dalla sottoroutine fcntl sovrascrivono le informazioni nella struct flock64 indicata dal parametro Argument . Se non viene trovato alcun blocco che impedisca che questo blocco venga creato, la struttura viene lasciata invariata, tranne che per il tipo di blocco (l_type) che è impostato su F_UNLCK. |
| F_SETLK64 | Imposta o cancella un blocco di segmento file in base alla descrizione di blocco puntata dal parametro Argomento . Il parametro Argomento deve essere un puntatore ad un tipo struct flock64, definito nel file flock.h . L'opzione F_SETLK viene utilizzata per stabilire i blocchi di lettura (o condivisi) (F_RDLCK) o le blocchi di scrittura (o esclusive) (F_WRLCK), nonché per rimuovere o per rimuovere il tipo di blocco (F_UNLCK). I tipi di blocco sono definiti dal file fcntl.h . Se non è possibile impostare un blocco condiviso o esclusivo, la sottoroutine fcntl ritorna immediatamente. |
| F_SETLKW64 | Esegue la stessa funzione dell'opzione F_SETLK a meno che un blocco di lettura o scrittura non venga bloccato da blocchi esistenti, nel qual caso il processo dorme fino a quando la sezione del file non è libera da bloccare. Se un segnale da catturare viene ricevuto mentre la subroutine fcntl è in attesa di una regione, la subroutine fcntl viene interrotta, restituisce un -1 e imposta la variabile globale errno su EINTR. L'operazione di blocco non è effettuata. |
Impostazione ID processo
| Elemento | Descrizione |
|---|---|
| F_GETOWN | Ottiene il processo ID o gruppo di processo attualmente in ricezione SIGIO e SIGURG segnali. I gruppi di processo vengono restituiti come valori negativi. |
| F_SETOWN | Imposta il processo o il gruppo di processo per ricevere i segnali SIGIO e SIGURG . I gruppi di processo sono specificati fornendo un valore Argomento negativo. In caso contrario, il parametro Argomento viene interpretato come un ID di processo. |
Descrittori File Di Chiusura
| Elemento | Descrizione |
|---|---|
| F_CLOSEM | Chiude tutti i descrittori di file da FileDescriptor fino al descrittore di file attualmente aperto più alto (U_maxofile). |
| OLD | Specifica un descrittore di file aperto. |
| Nuovo | Specifica un descrittore di file aperto che viene restituito dalla sottoroutine dup2 . |
Interfacce Compatibilità
La lockfx Subroutine
Le funzioni di sottoroutine fcntl sono simili alla sottoroutine lockfx , quando il parametro Comando è F_SETLK, F_SETLKWo F_GETLKe quando utilizzato nel seguente modo:
fcntl (descrittore di file, comando, argomento)
è equivalente a:
lockfx (descrittore di file, comando, argomento)
Il dup e dup2 Subroutines
Le funzioni di sottoroutine fcntl simili alle subroutine dup e dup2 , se utilizzate nel seguente modo:
dup (FileDescriptor)è equivalente a:
fcntl (FileDescriptor, F_DUPFD, 0) dup2 (Old, New)è equivalente a:
close (New);
fcntl(Old, F_DUPFD, New)Le subroutine dup e dup2 si differenziano dalla subroutine fcntl nei seguenti modi:
- Se il descrittore di file specificato dal parametro New è maggiore o uguale a OPEN_MAX, la subroutine dup2 restituisce un -1 e imposta la variabile errno su EBADF.
- Se il descrittore di file specificato dal parametro Vecchio è valido e uguale al descrittore di file specificato dal parametro Nuovo , la sottoroutine dup2 restituirà il descrittore di file specificato dal parametro Nuovo , senza chiuderlo.
- Se il descrittore di file specificato dal parametro Vecchio non è valido, la sottoroutine dup2 non avrà esito positivo e non chiuderà il descrittore di file specificato dal parametro Nuovo .
- Il valore restituito dalle subroutine dup e dup2 è uguale al parametro New quando viene completato con successo; in caso contrario, il valore restituito è -1.
Valori di ritorno
Al completamento di successo, il valore restituito dipende dal valore del parametro Comando , come segue:
| Elemento | Descrizione |
|---|---|
| Comando | Valore di ritorno |
| F_DUPFD | Un nuovo descrittore di file |
| F_GETFD | Il valore del flag (viene definito solo il bit FD_CLOEXEC ) |
| F_SETFD | Un valore diverso da -1 |
| F_GETFL | Il valore delle bandiere file |
| F_SETFL | Un valore diverso da -1 |
| F_GETOWN | Il valore del proprietario descrittore |
| F_SETOWN | Un valore diverso da -1 |
| F_GETLK | Un valore diverso da -1 |
| F_SETLK | Un valore diverso da -1 |
| F_SETLKW | Un valore diverso da -1 |
| F_CLOSEM | Un valore diverso da -1. |
Se la subroutine fcntl fallisce, viene restituito il valore -1 e la variabile globale errno viene impostata per indicare l'errore.
Codici di errore
La sottoroutine fcntl non è riuscita se uno o più dei seguenti sono veri:
| Elemento | Descrizione |
|---|---|
| EACCES | L'argomento Comando è F_SETLK; il tipo di blocco è un blocco condiviso o esclusivo e il segmento di un file da bloccare è già esclusivamente bloccato da un altro processo o il tipo è un blocco esclusivo e una parte del segmento di un file da bloccare è già condiviso - bloccato o esclusivo - bloccato da un altro processo. |
| EBADF | Il parametro FileDescriptor non è un descrittore file aperto valido. |
| EDEADLK | L'argomento Comando è F_SETLKW; il blocco è bloccato da qualche blocco da un altro processo e mettendo a dormire il processo di chiamata, in attesa che quel blocco diventi libero causerebbe uno stallo. |
| ENOTTY | Il descrittore di file non si riferisce ad un dispositivo terminale o socket. |
| EMFILE | Il parametro Comando è F_DUPFDe il numero massimo di descrittori di file è attualmente aperto (OPEN_MAX). |
| EINVAL | Il parametro Comando è F_DUPFDe il parametro Argomento è negativo o superiore o uguale a OPEN_MAX. |
| EINVAL | È stato fornito un valore illegale per il parametro Comando. |
| EINVAL | È stato effettuato un tentativo di bloccare un fifo o un pipe. |
| ESRCH | Il valore del parametro Comando è F_SETOWNe l'ID di processo specificato come parametro Argomento non è in uso. |
| EINTR | Il parametro Comando era F_SETLKW e il processo ha ricevuto un segnale mentre aspettava di acquisire la serratura. |
| EOVERFLOW | Il parametro Comando era F_GETLK e il blocco del blocco non poteva essere rappresentato nella struttura flock . |
Le subroutine dup e dup2 non riescono se una o entrambe le seguenti sono vere:
| Elemento | Descrizione |
|---|---|
| EBADF | Il parametro Vecchio specifica un descrittore di file aperto non valido o il parametro Nuovo specifica un descrittore di file fuori gamma. |
| EMFILE | Il numero di descrittori di file supera il valore OPEN_MAX o non esiste alcun descrittore di file sopra il valore del parametro Nuovo . |
Se NFS è installato sul sistema, la sottoroutine fcntl può avere esito negativo se si verifica quanto segue:
| Elemento | Descrizione |
|---|---|
| ETIMEDOUT | La connessione in timeout. |