Как я могу преобразовать указатель файла (FILE * fp) в дескриптор файла (int fd)?

174

У меня есть FILE *, вернулся по вызову fopen(). Мне нужно получить дескриптор файла из него, чтобы сделать вызовы, как fsync(fd)на нем. Какая функция для получения файлового дескриптора из файлового указателя?

Фил Миллер
источник
Или вы можете открыть файл с помощью open (2), и у вас будет файловый дескриптор с самого начала
Antoine Pelisse

Ответы:

214

Правильная функция есть int fileno(FILE *stream). Его можно найти в <stdio.h>стандарте POSIX, но это не стандарт C.

Фил Миллер
источник
4
Строго говоря, не было бы необходимости упоминать какие-либо заголовки или библиотеки, если функция действительно была частью стандартной библиотеки C. Однако это не является стандартным, поэтому имеет смысл хотя бы упомянуть заголовок.
2010 года
20
Для доступа к функциям в стандартной библиотеке C требуется наличие заголовков, по крайней мере, если ваш компилятор ожидает прототипы (я никогда не помню, что на самом деле является стандартным поведением в этом отношении). Без заголовков имена не определены в начале файла C.
Фил Миллер
1
@Novelocrat: Я не имел в виду, что в этом нет необходимости #include. Я просто имел в виду, что всегда легко найти имя подходящего заголовка для стандартной функции. Т.е. не очень важно упоминать точное название заголовка в ответе.
2010 года
9
Это хороший ответ, но стоит отметить, что это не стандартная функция c, это функция posix.
Эван Теран
6
Это не в стандарте C, потому что файловые дескрипторы - вещь UNIX (в Linux это open (2), а не open (3)).
не пользователь
42

Даже если fileno(FILE *)может вернуть дескриптор файла, ОЧЕНЬ осторожно, чтобы не обойти буфер stdio. Если имеются данные буфера (чтение или запись без записи), чтение / запись из дескриптора файла может дать неожиданные результаты.

Чтобы ответить на один из дополнительных вопросов, чтобы преобразовать дескриптор файла в указатель FILE, используйте fdopen(3)

Марк Геролиматос
источник
1
Я не верю, что это было полезно для людей, которые ищут именно это, и на это уже был дан ответ в разделе комментариев поста OP за месяц до того, как это было написано. Это скорее логическое уточнение, чем реальная информация.
kevr
4
Комментарии, которые очень важны, должны быть представлены как ответы. Огромный процент комментариев - это странные, бессмысленные мета-комментарии, подобные вашему ... и этот;)
Марк Джеролиматос