Sto cercando di capire che cosa questa riga di codice indica:Qual è lo scopo di chiamare fcntl() essere chiamato con il descrittore di file come -1 e cmd come F_GETFL?
flags = fcntl(-1,F_GETFL,0);
Sto cercando di capire che cosa questa riga di codice indica:Qual è lo scopo di chiamare fcntl() essere chiamato con il descrittore di file come -1 e cmd come F_GETFL?
flags = fcntl(-1,F_GETFL,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().
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:
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).
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;
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. –