Як я можу конвертувати покажчик файлу (FILE * fp) у дескриптор файлу (int fd)?


174

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


Або ви можете відкрити файл з відкритим (2), і у вас буде дескриптор файлу з самого початку
Антуан Пеліс

Відповіді:


214

Власна функція є int fileno(FILE *stream). Його можна знайти в <stdio.h>і є стандартом POSIX, але не є стандартом C.


4
Строго кажучи, не було б потреби згадувати будь-які заголовки чи бібліотеки, якби ця функція справді була частиною стандартної бібліотеки С. Однак він не є стандартним, саме тому, можливо, має сенс згадати заголовок хоча б.
ANT

20
Доступ до функцій у стандартній бібліотеці C вимагає включення заголовків, принаймні, якщо ваш компілятор очікує прототипів (я ніколи не пам'ятаю, що насправді є стандартною поведінкою в цьому відношенні). Без заголовків на початку файлу С не визначаються імена.
Філ Міллер

1
@Novelocrat: Я не мав на увазі, що нічого не потрібно #include. Я просто мав на увазі, що завжди легко знайти назву відповідного заголовка для стандартної функції. Тобто не дуже важливо згадувати точну назву заголовка у відповіді.
ANT

9
Це хороша відповідь, але варто зазначити, що це не стандартна функція c, це функція posix.
Еван Теран

6
Це не в стандарті C, тому що дескриптори файлів - це річ UNIX (для Linux це відкрито (2), а не відкрито (3)).
не-користувач

42

Навіть якщо ви fileno(FILE *)можете повернути дескриптор файлу, будьте ДУЖЕ обережними, щоб не обійти буфер stdio. Якщо є дані буфера (читання чи незапитання), читання / запис із дескриптора файлу може дати неочікувані результати.

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


1
Я не вірю, що це було корисно для людей, які спеціально шукали цього, і на це вже відповіли у розділі коментарів допису ОП за місяць до того, як це було написано. Це скоріше логічне уточнення, а не реальна інформація.
kevr

4
Зауваження, які є важливими для супутників, потребують відповіді. Величезний відсоток коментарів є химерними, безглуздими метакомментаріями, як ваш ... і цей;)
Марк Героліматос
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.