Próbuję zrozumieć, co ta linia kodu oznacza:Jaki jest cel wywoływania funkcji fcntl() z deskryptorem pliku jako -1 i cmd jako F_GETFL?
flags = fcntl(-1,F_GETFL,0);
Próbuję zrozumieć, co ta linia kodu oznacza:Jaki jest cel wywoływania funkcji fcntl() z deskryptorem pliku jako -1 i cmd jako F_GETFL?
flags = fcntl(-1,F_GETFL,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().
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ą:
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).
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;
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. –