Я пытаюсь понять, что означает эта строка кода:Какова цель вызова функции fcntl() с дескриптором файла как -1 и cmd как F_GETFL?
flags = fcntl(-1,F_GETFL,0);
Я пытаюсь понять, что означает эта строка кода:Какова цель вызова функции fcntl() с дескриптором файла как -1 и cmd как F_GETFL?
flags = fcntl(-1,F_GETFL,0);
fcntl()
функция выполняет различные действия на открытых дескрипторов. Синтаксис:
int fcntl(int descriptor,
int command,
...)
прочитать о Возвращаемое значение:
-1
тогда fcntl()
не был успешным. Глобальная переменная errno установлена для указания ошибки.этот код:
#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);
}
выход:
~$ gcc xx.c
~$ ./a.out
fcntl: : Bad file descriptor
-1
Примечание печатное flags
значение -1
, что указывает не успешный вызов fcntl(-1,F_GETFL,0);
потому -1
не допустимый описатель файла. И valid file descriptors начинается с 0
. (То есть то, что perror()
печатает сообщение об ошибках Bad file descriptor, EBADF)
примечание: я запускаю этот код в Linux системе.
Edit:
F_GETFL
для GET флагов команды в FCNTL().
Обычная причина для звонка fcntl()
с флагом F_GETFL
состоит в том, чтобы изменить флаги и установить их с помощью fcntl()
и F_SETFL
; альтернативной причиной вызова fcntl()
с F_GETFL
является выяснение характеристик файлового дескриптора. Вы можете найти информацию о том, какие флаги можно манипулировать, прочитав (а точнее) информацию о <fcntl.h>
. Флаги включают:
Plus (POSIX 2008) O_ACCMODE, которые затем могут быть использованы для различения O_RDONLY
, O_RDWR
и O_WRONLY
, если я правильно читать ссылки страницы.
Однако нет никакого смысла звонить fcntl()
с окончательно недействительным дескриптором файла, таким как -1
. Все, что происходит, это то, что функция возвращает -1
с указанием сбоя и устанавливает errno
в EBADF
(дескриптор файла).
Предположим, что мы говорим о функции, описанной man 2 fcntl
:
flags = fcntl(-1,F_GETFL,0);
пытается выполнить какое-либо действие на недопустимый дескриптор файла (-1
) и, следовательно, не будет никогда делать что-нибудь еще, но возвращение -1
и установить errno
до EBADF
.
Я бы сказал, что вы можете Савелий заменить эту строку:
flags = -1; errno = EBADF;
Так что цель вашего кода нет ничего, но показывает, что '-1' не является правильным дескриптором файла :), дайте мне знать, если вам нужна дополнительная помощь в этом. –