2013-05-15 6 views

ответ

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().

+0

Так что цель вашего кода нет ничего, но показывает, что '-1' не является правильным дескриптором файла :), дайте мне знать, если вам нужна дополнительная помощь в этом. –

4

Обычная причина для звонка fcntl() с флагом F_GETFL состоит в том, чтобы изменить флаги и установить их с помощью fcntl() и F_SETFL; альтернативной причиной вызова fcntl() с F_GETFL является выяснение характеристик файлового дескриптора. Вы можете найти информацию о том, какие флаги можно манипулировать, прочитав (а точнее) информацию о <fcntl.h>. Флаги включают:

  • O_APPEND - установить режим добавления.
  • O_DSYNC - запись в соответствии с завершением целостности данных с синхронизированным вводом-выводом.
  • O_NONBLOCK - Неблокирующий режим.
  • O_RSYNC - Операции ввода-вывода с синхронизированным считыванием.
  • O_SYNC - запись в соответствии с завершением целостности синхронизированного ввода-вывода.

Plus (POSIX 2008) O_ACCMODE, которые затем могут быть использованы для различения O_RDONLY, O_RDWR и O_WRONLY, если я правильно читать ссылки страницы.

Однако нет никакого смысла звонить fcntl() с окончательно недействительным дескриптором файла, таким как -1. Все, что происходит, это то, что функция возвращает -1 с указанием сбоя и устанавливает errno в EBADF (дескриптор файла).

3

Предположим, что мы говорим о функции, описанной man 2 fcntl:

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

пытается выполнить какое-либо действие на недопустимый дескриптор файла (-1) и, следовательно, не будет никогда делать что-нибудь еще, но возвращение -1 и установить errno до EBADF.

Я бы сказал, что вы можете Савелий заменить эту строку:

flags = -1; errno = EBADF;