2013-05-15 5 views

Odpowiedz

0

Funkcja fcntl() wykonuje różne działania na otwartych deskryptorów. Jego składnia jest następująca:

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

Przeczytaj o Return Value:

  • -1 następnie fcntl() nie był udany. Zmienna globalna errno jest ustawiona, aby wskazywać błąd.

ten kod:

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

wyjście jest:

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

-1 

Wskazówka wydrukowany wartość flags jest -1 wskazująca nie udane wezwanie fcntl(-1,F_GETFL,0); ponieważ -1 nie jest prawidłowym deskryptorem pliku. I valid file descriptors zaczyna się od 0. (to jest, co perror() drukuje komunikat o błędzie Bad file descriptor, EBADF)

uwaga: Uruchomiłem ten kod w systemie Linux.

Edit:
F_GETFL jest na flagi polecenia GET w fcntl().

+0

Więc celem kodzie jest tylko pokazuje, że '-1' nie jest poprawnym deskryptor pliku :), daj mi znać, jeśli potrzebujesz więcej pomocy w tej sprawie. –

4

Zazwyczaj powodem wywołania fcntl() flagą F_GETFL jest zmodyfikowanie flag i ustawienie ich za pomocą fcntl() i F_SETFL; alternatywnym powodem wywołania fcntl() zjest poznanie charakterystyki deskryptora pliku. Możesz znaleźć informacje na temat flag, którymi można manipulować, czytając (raczej ostrożnie) informacje o <fcntl.h>. Flagi obejmują:

  • O_APPEND - Ustaw tryb dołączania.
  • O_DSYNC - Zapisz zgodnie z zakończeniem synchronizacji danych wejścia/wyjścia.
  • O_NONBLOCK - Tryb bez blokowania.
  • O_RSYNC - synchroniczne operacje we/wy odczytu.
  • O_SYNC - Zapisz zgodnie z zakończeniem synchronizacji operacji we/wy.

Plus (POSIX 2008) O_ACCMODE, które mogą być następnie wykorzystane do odróżnienia O_RDONLY, O_RDWR, a O_WRONLY, jeśli czytam odwołuje stron prawidłowo.

Jednak nie ma sensu wywoływanie fcntl() z definitywnie niepoprawnym deskryptorem pliku, takim jak -1. Wszystko to dzieje się tak, że funkcja zwraca -1, wskazując awarię i ustawia errno na EBADF (zły deskryptor pliku).

3

Zakładając, że mówimy o funkcji opisanej przez man 2 fcntl:

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

próbuje wykonać pewne działania na nieprawidłowym deskryptorze pliku (-1) i dlatego będzie nigdy nie robić niczego innego Wracając jednak -1 i ustawić errno do EBADF.

Powiedziałbym można savely zastąpić tę linię poprzez:

flags = -1; errno = EBADF;