2013-05-15 13 views

risposta

0

La funzione fcntl() esegue varie azioni su descrittori aperti. La sua sintassi è:

int fcntl(int descriptor, 
      int command, 
      ...) 

leggere su Valore di ritorno:

  • -1 poi fcntl() non ha avuto successo. La variabile globale errno è impostata per indicare l'errore.

questo codice:

#include <sys/types.h> 
#include <unistd.h> 
#include <fcntl.h> 
int main(){ 
    int flags; 
    if((flags = fcntl(-1,F_GETFL,0)) < 0){ 
    perror("fcntl: "); 
    } 
    printf("\n %d\n", flags); 
} 

output è:

~$ gcc xx.c 
~$ ./a.out 
fcntl: : Bad file descriptor 

-1 

Avviso il flags valore stampato è -1 che indica chiamata non riuscito di fcntl(-1,F_GETFL,0); perché -1 non è un descrittore di file valido. E valid file descriptors inizia da 0. (Vale a dire quale errore perror() stampe messaggio Bad file descriptor, EBADF)

nota: ho eseguito questo codice nel sistema Linux.

Edit:
F_GETFL è per bandiere comando get a fcntl().

+0

Quindi lo scopo del codice non è altro che dimostra che '-1' non è un descrittore di file valido :), fatemi sapere se hai bisogno di più aiuto su questo. –

4

Il motivo normale per chiamare fcntl() con il flag F_GETFL è modificare i flag e impostarli con fcntl() e F_SETFL; il motivo alternativo per chiamare fcntl() con F_GETFL è scoprire le caratteristiche del descrittore di file. È possibile trovare le informazioni su quali flag possono essere manipolati leggendo (piuttosto attentamente) le informazioni su <fcntl.h>. Le bandiere includono:

  • O_APPEND - Imposta la modalità di aggiunta.
  • O_DSYNC - Scrive in base al completamento dell'integrità dei dati di I/O sincronizzati.
  • O_NONBLOCK - Modalità non bloccante.
  • O_RSYNC - Operazioni di I/O di lettura sincronizzate.
  • O_SYNC - Scrive in base al completamento dell'integrità del file I/O sincronizzato.

più (POSIX 2008) O_ACCMODE, che possono poi essere utilizzati per distinguere O_RDONLY, O_RDWR e O_WRONLY, se sto leggendo le pagine di riferimento in modo corretto.

Tuttavia, non ha assolutamente senso chiamare fcntl() con un descrittore di file definitivamente non valido come -1. Tutto ciò che accade è che la funzione restituisce -1 indicando un errore e imposta errno su EBADF (descrittore di file non valido).

3

Supponendo stiamo parlando della funzione descritta da man 2 fcntl:

flags = fcntl(-1,F_GETFL,0); 

tenta di eseguire una certa azione su un descrittore di file non valido (-1) e, pertanto, saranno mai fare altro ma tornando -1 e impostare errno a EBADF.

direi che si può savely sostituire questa linea da:

flags = -1; errno = EBADF;