Fileno дать дескриптор файла


Содержание

Получить дескриптор файла из файлового указателя без fileno()

Можно ли получить файловый дескриптор из файлового указателя без использования fileno(FILE* file) ?

В частности, возможно ли использование только функций из стандартной библиотеки C? (Причина моего вопроса на самом деле в том, что fileno() — это стандартная функция POSIX, но не стандартная C.)

Файловые дескрипторы не являются частью стандарта C. Стандарт C не обязывает систему реализовывать стандартную библиотеку ввода-вывода с использованием файловых дескрипторов. Следовательно, нет способа получить дескриптор файла из файлового потока, используя стандарт C; Концепция файлового дескриптора просто не является частью стандарта C. Поэтому fileno() не является стандартной функцией C.

Стандарт C11 §7.21 Ввод/вывод не определяет никаких функций, использующих файловые дескрипторы.

Если fileno() не является стандартной функцией, какое значение возвращает функция open() ?

Функция open() не является частью стандартного C; ни одна из функций, использующих файловые дескрипторы, не является частью стандарта C. Стандарт POSIX предоставляет функции, использующие файловые дескрипторы — их много, включая open() и fileno() . Большинство систем предоставляют функции расширения, которые не определены в POSIX, но используют файловые дескрипторы.

плохой файловый дескриптор fileno

0 atkawa7 [2015-09-19 07:45:00]

У меня возникли проблемы с использованием fcntl() и fileno. У меня возникла проблема с внедрением механизма блокировки. Однако, когда я пытаюсь закрыть файл, я получаю следующую ошибку fcntl: Плохой дескриптор файла. Я использую fileno, чтобы получить описание файла, и я получаю -1.

c file operating-system

2 ответа

2 3442 [2015-09-19 08:12:00]

EBADF: fd не является открытым файловым дескриптором, или команда или команда F_SETLK или F_SETLKW а режим открытого описания дескриптора файла не соответствует типу запрашиваемой блокировки.

И, случается так, что вы не устанавливаете элемент lock l_type в F_WRLCK , как указано в man-странице выше. Таким образом, просто добавьте эту строку перед первым вызовом fcntl() и все будет хорошо.

0 u__ [2015-09-19 09:11:00]

с справочной страницы fcntl как @KemyLand Указано выше

EBADF fd не является открытым файловым дескриптором, или команда F_SETLK или F_SETLKW, а режим открытия дескриптора файла не соответствует типу запрашиваемой блокировки.

это, вероятно, означает, что проблема здесь

Хотя эта программа, похоже, хорошо работает с нижеприведенным вариантом, но мне трудно объяснить, почему, похоже, это хорошо работает с ними, что-то вроде уверенности в открытии логики.

Вопрос по operating-system, file-descriptor, unix &#8211 Файловые дескрипторы являются дескрипторами файла. Они дают ссылки на файл. С их помощью мы можем читать, писать и открывать файл.

ожет быть более упрощенным описанием файловых дескрипторов по сравнению с Википедией? Зачем они нужны? Скажем, возьмем процессы оболочки в качестве примера и как это применимо к нему?

Содержит ли таблица процессов более одного дескриптора файла. Если да, то почему?

файл. С их помощью мы можем читать, писать и открывать файл.

Unix рассматривает все как файловую систему. Ваша клавиатура — это файл, который читается только с точки зрения ядра. Экран — это файл только для записи. Аналогичным образом, папки, устройства ввода-вывода и т. Д. Также считаются файлами. Когда файл открывается, скажем, когда драйверы устройств [для файлов устройств] запрашивают open (), или процесс открывает пользовательский файл, ядро ​​выделяет дескриптор файла, целое число, которое определяет доступ к этому файлу, так что он доступен только для чтения. , пишите только и т.д. [для справки:https://en.wikipedia.org/wiki/Everything_is_a_file ]

Файловые дескрипторы (FD):

ВLinux / Unix, все это файл. Обычный файл, каталоги и даже устройства являются файлами. Каждый файл имеет связанный номер, называемый дескриптором файла (FD).Ваш экран также имеет дескриптор файла. Когда программа выполняется, вывод отправляется в дескриптор файла на экране, и вы видите вывод программы на вашем мониторе. Если выходные данные отправляются в дескриптор файла принтера, выходные данные программы будут напечатаны.

Перенаправление ошибок:
Всякий раз, когда вы выполняете программу / команду в терминале, всегда открыты 3 файла.стандартный вводстандартный выводстандартная ошибка.
Эти файлы всегда присутствуют при запуске программы. Как объяснено ранее файловый дескриптор, связан с каждым из этих файлов.
файлДескриптор файла
Стандартный вход STDIN 0
Стандартный выход STDOUT 1
Стандартная ошибка STDERR 2

Например, при поиске файлов обычно получаются ошибки, в которых отказано в разрешении, или какие-либо другие ошибки. Эти ошибки могут быть сохранены в конкретном файле.
Пример 1

$ ls mydir 2> errorsfile.txt

Дескриптор файла для стандартной ошибки — 2.
Если нет каталога с именем mydir, вывод команды будет сохранен в файле errorfile.txt.
Используя «2>», мы перенаправляем вывод ошибок в файл с именем «errorfile.txt»
Таким образом, вывод программы не загроможден ошибками.

Я надеюсь, что вы получили свой ответ.

Услышь это изо рта лошади: APUE (Ричард Стивенс).
В ядре все открытые файлы упоминаются дескрипторами файлов. Файловый дескриптор является неотрицательным числом.
Когда мы открываем существующий файл или создаем новый файл, ядро ​​возвращает файловый дескриптор процессу. Ядро поддерживает таблицу всех открытых дескрипторов файлов, которые используются. Выделение файловых дескрипторов, как правило, является последовательным, и они выделяются для файла в качестве следующего свободного файлового дескриптора из пула бесплатных файловых дескрипторов. Когда мы закрываем файл, дескриптор файла освобождается и становится доступным для дальнейшего выделения.
Смотрите это изображение для более подробной информации:

Когда мы хотим прочитать или записать файл, мы идентифицируем файл с дескриптором файла, который был возвращеноткрытый() или жеСоздайте() вызов функции и использовать его в качестве аргументачитать() или жезаписывать().
По соглашению системные оболочки UNIX связывают дескриптор файла 0 сСтандартный ввод процесса, файловый дескриптор 1 сСтандартный выводи файл desciptor 2 сСтандартная ошибка.
Дескриптор файла варьируется от 0 до OPEN_MAX.
Для получения дополнительной информации просмотрите 3-ю главу книги APUE.

Илон Маск рекомендует:  tr в HTML

fileno cast FILE для дескриптора C

Есть ли способ передать переменную типа int (файловый дескриптор) в тип FILE в C? У меня есть открытый канал fd, и я хочу использовать функции, ожидающие FILE.

Вы не можете его бросить, но вы можете вызвать fdopen(3) , который делает именно то, что вы хотите:

Функция fdopen() связывает поток с существующим файловым дескриптором, fildes. Режим потока должен быть совместим с режимом дескриптора файла. Когда поток закрывается через fclose(3) , также закрываются филды.

В системах POSIX вы можете использовать fdopen для создания FILE * который ссылается на дескриптор файла.

Файловые дескрипторы Linux

Основными операциями, предоставляемыми ядром операционной системы программам (а точнее — процессам) для работы с файлами, являются системные вызовы open read, write и close. В соответствии со своими именами, эти системные вызовы предназначены для открытия и закрытия файла, для чтения из файла и записи в файл. Дополнительный системный вызов ioctl (input output control) используется для управления драйверами устройств и, как следствие, применяется в основном для специальных файлов устройств.

При запросе процесса на открытие файла системным вызовом оpen производится его однократный (относительно медленный) поиск имени файла в дереве каталогов и для запросившего процесса создается так называемый файловый дескриптор (описатель, от англ, descriptor).

Файловый дескриптор «содержит» информацию, описывающую файл, например индексный дескриптор inode файла на файловой системе, номера major и minor устройства, на котором располагается файловая система файла, режим открытия файла, и прочую служебную информацию.

При последующих операциях read и write доступ к самим данным файла происходит с использованием файлового дескриптора (что исключает медленный поиск файла в дереве каталогов).

Файловые дескрипторы пронумерованы и содержатся в таблице открытых процессом файлов, которую можно получить при помощи диагностической программы lsof.

В обратную сторону получить список процессов, открывших тот или иной файл, можно при помощи программ lsof и fuser, что бывает полезно для идентификации программ, «занявших» файловую систему, подлежащую отмонтированию.

Таблица файловых дескрипторов

$ lsof -р $$

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

. . . . . . . . .
bash 17975 john 1u CHR 136,2 0t0 5 /dev/pts/2

# lsof /dev/log

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

rsyslogd 543 syslog 0u unix 0xefef5680 0t0 1338 /dev/log

# fuser /dev/log

/dev/log: 543
root@ubuntu:

# ps p 543

PID TTY STAT TIME COMMAND
543 ? Sl 0:43 rsyslogd -c5

# lsof /var/log/syslog

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

rsyslogd 543 syslog lw REG 252,0 29039 26214496 /var/log/syslog

В первом примере из листинга выше показано получение списка файловых дескрипторов (столбец FD) процесса командного интерпретатора bash пользователя john, на котором файловый дескриптор номер 1 описывает открытый на чтение и запись и специальный символьный CHR файл устройства /dev/pts/2.

Во втором примере показано получение информации о процессе, открывшем файловый сокет unix с именем /dev/log (файловый дескриптор номер 0 на чтение и запись u) и обычный файл REG с именем /var/log/sysog (файловый дескриптор номер 1 на запись w).

Пронаблюдать за использованием системных вызовов файлового программного интерфейса в момент выполнения программам позволяет системный трассировщик strace.

Трассировка файлового программного интерфейса

$ date

Вт. окт. 15 18:17:42 MSK % 2020

$ strace -fe open, close, read, write, ioctl date

open(«/etc/localtime», 0_RDONLY|0_CLOEXEC) = 3

$ file /etc/localtime
/etc/localtime: timezone data, version 2, 13 gmt time flags, 13 std time flags, no leap

seconds, 77 transition tines, 13 abbreviation char
john@ubuntu:

$ ls -la /dev/dvd
lrwxrwxrwx 1 root root 3 окт. 16 18:09 /dev/dvd -> sr0

$ strace -fe open,close, read,write,ioctl eject

. . . . . . . . .
open(«/dev/sr0», O_RDWR|O_N0NBLOCK) = 3
ioctl(3, CDROMEJECT, 0x804cb4e) = 0
closed(3) = 0
john@ubuntu:

$ strace -fe open, read,write,close,ioctl setleds -L +num +scroll
ioctl(0, KDGKBLED, 0xbfe4f4ff) = 0
ioctl(0, KDGETLED, 0xbfe4f4fe) = 0
ioctl(0, KDSETLED, 0x3) = 0

Предположив, что программа date показывает правильное московское время, потому что узнаёт заданную временную зону MSK из некоего конфигурационного файла операционной системы, при трассировке ее «работы можно установить его точное имя — /etc/localtime.

Аналогично предположив, что программа eject открывает лоток привода CD/DVD при помощи специального файла устройства, при трассировке можно узнать имя файла /dev/sr0, номер файлового дескриптора при работе с файлом 3 и команду CDROMEJECT соответствующего устройству
драйвера ioctl_List.

Трассировка команды setleds показывает, что она вообще не открывает никаких файлов, но пользуется файловым дескриптором о так называемого стандартного потока ввода (прикрепленного, к текущему терминалу) и командами kdgetled и kdsetled драйвера консоли console_ioctl.

Fileno дать дескриптор файла

В чем разница между макросом STDIN_FILENO и переменной stdin и как их не перепутать?

Разные типы данных

stdin определен с типом файлового потока FILE*, относящимся к стандартному высокоуровневому вводу-выводу библиотеки C. Заголовок .
Функции: fread, fwrite, fclose, fflush и т.д.

STDIN_FILENO это файловый дескриптор (файл, сокет, пайп и т.д.; тип int). Используется не буферизованный ввод/вывод, а прямой вызов системных функций. Заголовок .
Функции: read, write, select и т.д.

Фрагмент заголовка /usr/include/unistd.h:
/ * Standard file descriptors. * /
#define STDIN_FILENO 0 / * Standard input. * /
#define STDOUT_FILENO 1 / * Standard output. * /
#define STDERR_FILENO 2 / * Standard error output. * /

stdin это высокий уровень абстракции, файловые потоки, библиотека C. Системные вызовы лежат ниже и будут вызваны уже не в нашем, в данном случае, коде.

STDDIN_FILENO это уровень ядра, системных вызовов. В системном API операции с файлами, сокетами, пайпами выполняются через файловые дескрипторы.

Представьте, как такой дескриптор, как STDIN_FILENO=0, 1 и 2, может соответствовать открытому файлу в пространстве пользователя, и отличаться от других?

Также, если перепутать stdin и 0, при подстановке неверных типов компилятор выдаст предупреждение.

Из потокового типа FILE* можно получить его номер типа int, функцией fileno:
int fileno(FILE *stream);
И наоборот, для открытого файла с известным дескриптором тип int, можно создать поток:
FILE *fdopen(int fd, const char *mode);

Дескриптор файла — File descriptor

В Unix и связанных с ними компьютерных операционных системах, в дескриптор файла ( FD , реже Филдс ) является абстрактным индикатор ( ручка ) используется для доступа к файл или другой входной / выходной ресурс , например, трубы или гнездо сети . Файловые дескрипторы являются частью POSIX интерфейса прикладного программирования . Дескриптор файла представляет собой неотрицательное целое число , как правило , представлены в C языке программирования как типа Int (Отрицательные значения зарезервированы для указания «нет значения» или состояния ошибки).

Каждый Unix процесс ( за исключением , возможно, демон ) следует ожидать , чтобы иметь три стандартных дескрипторов файлов POSIX, соответствующих трем стандартным потокам :

Целое значение название символическую константу файл потока
Стандартный вход STDIN_FILENO STDIN
1 Стандартный выход STDOUT_FILENO стандартный вывод
2 Стандартная ошибка STDERR_FILENO STDERR

содержание

обзор

В традиционной реализации Unix, индекс файловых дескрипторов в процессе каждого дескриптора файла таблицы поддерживается ядром, что в свою очередь , индексы в общесистемной таблице файлов , открываемых всеми процессами, называется таблица файлов . Эта таблица записывает режим , с которым был открыт файл (или другой ресурс): для чтения, записи, добавления, и , возможно , другие режимы. Также индексы в третью таблицу называется индексной таблица , которая описывает реальные , лежащие в основе файлов. Для того, чтобы выполнить вход или выход, процесс переходит в файловый дескриптор к ядру через системный вызов , и ядро будет доступ к файлу от имени процесса. Процесс не имеет прямой доступ к таблицам файлов или индексных дескрипторов.

Илон Маск рекомендует:  Что такое код ibase_connect

На Linux , набор файловых дескрипторов , открытых в процессе можно получить по пути /proc/PID/fd/ , где PID является идентификатор процесса .


В Unix-подобных систем, файловых дескрипторов может относиться к любому типу файла Unix с именем в файловой системе. Так же как и с обычными файлами, это включает в себя каталоги , блок и символьные устройства (также называемые «специальные файлы»), сокеты Unix и именованные каналы . Файловые дескрипторы могут также ссылаться на другие объекты , которые обычно не существуют в файловой системе, например, анонимные трубы и сетевые сокеты .

Структура файла данных в стандарте C ввода / вывода библиотеки , как правило , включает в себя дескриптор файла низкого уровня для данного объекта на Unix-подобных системах. Общая структура данных обеспечивает дополнительную абстракцию и вместо этого известна как файл ручка .

Операции по файловых дескрипторов

Ниже перечислены типичные операции на файловых дескрипторов на современных Unix-подобных систем. Большинство из этих функций объявлены в заголовке, но некоторые из них в заголовке вместо этого.

Создание файловых дескрипторов

  • открыт ()
  • Creat ()
  • разъем()
  • принимаем ()
  • socketpair ()
  • Труба ()
  • opendir ()
  • open_by_handle_at () (Linux)
  • signalfd () (Linux)
  • eventfd () (Linux)
  • timerfd_create () (Linux)
  • memfd_create () (Linux)
  • userfaultfd () (Linux)

Наследование файловых дескрипторов

  • dirfd ()
  • fileno ()

Операции на одном дескрипторе файла

  • чтения (), написать ()
  • readv () , writev ()
  • pread () , pwrite ()
  • RECV () , отправить ()
  • recvmsg () , sendmsg () ( в том числе позволяя посылать FDS)
  • Отправить файл()
  • lseek ()
  • fstat ()
  • fchmod ()
  • fchown ()
  • fdopen ()
  • ftruncate ()
  • FSYNC ()
  • fdatasync ()
  • fstatvfs ()
  • dprintf ()
  • vmsplice () (Linux)

Операции на нескольких файловых дескрипторов

  • выберите () , pselect ()
  • опрос()
  • Epoll () (для Linux)
  • Kqueue () (для систем BSDоснованных).
  • Отправить файл()
  • сращивание () , тройник () (для Linux)

Операции по таблице дескрипторов файлов

Fcntl () функция используется для выполнения различных операций файлового дескриптора, в зависимости от аргумента команды , переданного ей. Есть команды , чтобы получить и установить атрибуты , связанные с файловым дескриптором, в том числе F_GETFD, F_SETFD, F_GETFL и F_SETFL .

  • близко()
  • closefrom () (BSD и Solaris только, удаляет все файловые дескрипторы , больше или равно указанному номеру)
  • DUP () (дублирует существующий дескриптор файла гарантирует, что самый низкий Дескриптор номер доступен файл)
  • dup2 () (новый дескриптор файла будет иметь значениепереданноекачестве аргумента)
  • Fcntl (F_DUPFD)

Операции, которые изменяют состояние процесса

  • fchdir () (устанавливает текущий рабочий каталог процесса, основанного на файле каталога дескриптора)
  • ММАП () (отображает диапазоны файла в адресное пространство процесса)

блокирование файлов

  • стадо()
  • Fcntl () (F_GETLK, F_SETLK) и F_SETLKW
  • lockf ()

Розетки

  • подключения ()
  • связывания ()
  • Слушать()
  • принимают () (создает новый дескриптор файла для входящего соединения)
  • getsockname ()
  • getpeername ()
  • getsockopt ()
  • setsockopt ()
  • выключение () (отключает одну или обе половинки дуплексный)

Разнообразный

  • IOCTL () (большая коллекция разнообразных операций на одном дескрипторе файла, часто связанный с устройством)

Открытые операции

Ряд новых операций на файловых дескрипторов добавлен многих современных Unix-подобных систем, а также многочисленные библиотеки C, чтобы быть стандартизированы в будущей версии POSIX . at Суффикс означает , что функция принимает дополнительный первый аргумент подачи дескриптора файла , из которого относительные пути разрешаются, формы , не имеющие at суффикс , таким образом , становится эквивалентно переходу файловый дескриптор , соответствующий текущему рабочему каталогу . Цель этих новых операций для защиты от определенного класса TOCTTOU атак.

  • openat ()
  • faccessat ()
  • fchmodat ()
  • fchownat ()
  • fstatat ()
  • futimesat ()
  • linkat ()
  • mkdirat ()
  • mknodat ()
  • readlinkat ()
  • renameat ()
  • symlinkat ()
  • unlinkat ()
  • mkfifoat ()
  • fdopendir ()

Дескрипторы файлов, как возможности

Дескрипторы Unix ведут себя во многих отношениях как возможности . Они могут передаваться между процессами через доменные сокеты Unix с помощью sendmsg() системного вызова. Однако следует отметить, что то , что на самом деле прошло это ссылка на «открытом описание файла» , который имеет изменяемое состояние (смещение файла и статус файла и флаги доступа). Это затрудняет безопасное использование файловых дескрипторов как возможности, так как, когда программы доли доступ к тому же описанию открытого файла, они могут мешать работе друг друга его, изменив его смещение или блокируют или неблокируемый, например , является ли. В операционных системах, которые специально разработаны как системы Capability, там очень редко изменяемое состояние , связанное с самой возможностью.

Процесс дескриптор файла таблица Unix является примером C-список .

11.2.1. Файловые дескрипторы

11.2.1. Файловые дескрипторы

Когда процесс получает доступ к файлу (что обычно называют открытием файла), то ядро возвращает ему файловый дескриптор, который затем используется процессом для всех операций с файлом. Файловые дескрипторы — это маленькие положительные целые числа, которые служат индексами массива открытых файлов, создаваемого ядром для каждого процесса.

Первые три файловых дескриптора для процессов (0, 1 и 2) имеют стандартное назначение. Первый, 0, известен как стандартный ввод (stdin) и является местом, откуда программы должны получать свой интерактивный ввод. Файловый дескриптор 1 называется стандартным выводом (stdout), и большая часть вывода программ должна быть направлена в него. Сообщения об ошибках должны направляться в стандартный поток ошибок (stderr), который имеет файловый дескриптор 2. Стандартная библиотека С следует этим правилам, поэтому gets() и printf() используют stdin и stdout соответственно, и это соглашение дает возможность командным оболочкам правильно перенаправлять ввод и вывод процессов.

Заголовочный файл представляет макросы STDIN_FILENO , STDOUT_FILENO и STDERR_FILENO , которые вычисляются как файловые дескрипторы stdin, stdout и stderr соответственно. Использование этих символических имен делает код более читабельным.

Многие из файловых операций, которые манипулируют файловыми узлами inode, доступны в двух формах. Первая форма принимает в качестве аргумента имя файла. Ядро использует этот аргумент для поиска inode файла и выполняет соответствующую операцию над ним (обычно это включает следование символическим ссылкам). Вторая форма принимает файловый дескриптор в качестве аргумента и выполняет операцию над inode, на который он ссылается. Эти два набора системных вызовов используют похожие имена, но системные вызовы, работающие с файловыми дескрипторами, имеют префикс f. Например, системный вызов chmod() изменяет права доступа для файла, ссылка на который осуществляется по имени; fchmod() устанавливает права доступа к файлу, ссылаясь на него по указанному файловому дескриптору.

Чтобы меньше тратить слов, мы представим обе версии системных вызовов, если они существуют, а обсуждать будет только первую из их (та, которая использует имена файлов).

Илон Маск рекомендует:  Как на vc5 0 создать окошко на full screen

Похожие главы из других книг

16.3. Индексные дескрипторы файлов

16.3. Индексные дескрипторы файлов Каждому файлу на диске соответствует один и только один индексный дескриптор файла, который идентифицируется своим порядковым номером — индексом файла. Это означает, что число файлов, которые могут быть созданы в файловой системе,

Файловые таблицы

Файловые таблицы Эта группа таблиц содержит информацию обо всех файлах, составляющих программный продукт. Большая часть этих файлов перечислена в таблице File. Таблица Directory не входит в эту группу, но, тем не менее, очень тесно связана с ней, так как отражает структуру

Файловые менеджеры

Файловые менеджеры На протяжении всей книги уже не раз упоминалось о двух популярных файловых менеджерах – Konqueror из KDE и Nautilus из GNOME. Пользователям, работающим в консоли, можно предложить Midnight Commander (пакет mc). Две панели сине-белого цвета со строкой меню, расположенной

Наследуемые дескрипторы

Наследуемые дескрипторы Часто бывает так, что дочернему процессу требуется доступ к объекту, к которому можно обратиться через дескриптор, определенный в родительском процессе, и если этот дескриптор — наследуемый, то дочерний процесс может получить копию открытого

Абсолютные и самоопределяющиеся относительные дескрипторы безопасности

Абсолютные и самоопределяющиеся относительные дескрипторы безопасности Программа 15.5, позволяющая изменять ACL, удобна тем, что просто заменяет один дескриптор безопасности (SD) другим. В то же время, при замене существующих SD следует проявлять осторожность, поскольку они

1.1.3. Дескрипторы вместо классов

1.1.3. Дескрипторы вместо классов Программируя в Delphi, мы быстро привыкаем к тому, что каждый объект реализуется экземпляром соответствующего класса. Например, кнопка реализуется экземпляром класса TButton, контекст устройства — классом TCanvas. Но когда создавались первые

6.5. Файловые структуры

6.5. Файловые структуры Файловая структура может быть одно– или многоуровневой. В одноуровневой структуре на носителе информации имена файлов образуют линейную последовательность, в многоуровневой, или иерархической, – древовидную структуру. Примером такой структуры

6.6. Файловые системы

6.6. Файловые системы 6.6.1. Назначение и функционирование файловой системы В операционных системах файловая система относится к основным понятиям и определяется как общая система, которая устанавливает правила присвоения имен файлам, хранение, организацию и обработку

11.2.1. Файловые дескрипторы

11.2.1. Файловые дескрипторы Когда процесс получает доступ к файлу (что обычно называют открытием файла), то ядро возвращает ему файловый дескриптор, который затем используется процессом для всех операций с файлом. Файловые дескрипторы — это маленькие положительные целые

4.4.2.1. Отображение переменных FILE* на дескрипторы файлов

4.4.2.1. Отображение переменных FILE* на дескрипторы файлов Стандартные библиотечные функции ввода/вывода и переменные FILE* из , такие, как stdin, stdout и stderr, построены поверх основанных на дескрипторах файлов системных вызовах.Иногда полезно получить непосредственный

7.2.5. Дескрипторы файлов процесса

7.2.5. Дескрипторы файлов процесса Элемент fd файловой системы /proc — это подкаталог, в котором содержатся записи обо всех файлах, открытых процессом. Каждая запись представляет собой символическую ссылку на файл или устройство. Через эти ссылки можно осуществлять чтение и

Индексные дескрипторы

Индексные дескрипторы Индексный дескриптор, или inode, содержит информацию о файле, необходимую для обработки данных, т.е. метаданные файла. Каждый файл ассоциирован с одним inode, хотя может иметь несколько имен в файловой системе, каждое из которых указывает на один и тот же

Виртуальные индексные дескрипторы

Виртуальные индексные дескрипторы Дисковый файл обычно имеет связанную с структуру данных, называемую метаданными или inode, где хранятся основные характеристики данного файла и с помощью которой обеспечивается доступ к его данным. Одним из исключений из этого правила

18.7.10. Цикл while и дескрипторы файлов

2.5 Индексные дескрипторы

2.5 Индексные дескрипторы Файл имеет несколько атрибутов: имя, содержимое и служебную информацию (права доступа и даты модификации). Служебная информация размещается в индексном дескрипторе вместе с важной системной информацией, такой, как размер файла, место хранения

Fileno дать дескриптор файла

Файловые дексерипторы существуют на двух уровнях: общесистемном и для каждого процесса.

Файловые дескрипторы для каждого процесса ( fdtable ) не уникальны, но привязываются к v-node таблице, которая содержит значения для всей системы.

Вызовы fopen() и fileno() возвращают номера дескрипторов для процесса, т.е. fdtable. Далее будет рассматриваться только эта таблица.

Дескрипторы привязываются к процессу.

Для примера запустим процесс в фоне

[1] 9590

В консоль будет выведен идентификатор, это 9590. По нему можно смотреть информацию в частности при помощи lsof.

Здесь интерес представляют четвертая и пятая колонки: FD и TYPE (файловый дескриптор и тип файлового дескриптора).

Для FD могут быть такие значения:

  • cwd – Current Working Directory
  • txt – Text file
  • mem – Memory mapped file
  • mmap – Memory mapped device

Буква показывает в каком режиме открыт файл.

u — чтение и запись

Значения TYPE могут быть такими:

  • REG – Regular File
  • DIR – Directory
  • FIFO – First In First Out

Еще можно увидеть дескрипторы в каталоге процесса

Fileno дать дескриптор файла

Возможно ли, (ну не могу найти) запросить имя файла в програме для открытого файл-дескриптора?

Есть програма, в которой в процессе открываются и периодически закрываются файлы.
В определенный момент нужно проверить, если данный фаил все еше открыт в програме.
Можно бы использовать fstat( fdesc, buff ), но усложнение в том, что если после закрытия интересуемого файла открывался другой, большая вероятность, что этот дескриптор номер опять использован.
Тогда fstat(..) вернется без ошибки, но это будет статус другого файла.
Поэтому было бы хорошо также получит имя открытого фаила и сравнить с искомым.

Или, другой вариант, проверить, если фаил с данным именем в данный момент открыт в программе.
Может такое возможно?

Цитата:

Q: How can I recover the file name given an open stream or file descriptor?

A: This problem is, in general, insoluble. Under Unix, for instance, a scan of the entire disk (perhaps involving special permissions) would theoretically be required, and would fail if the descriptor were connected to a pipe or referred to a deleted file (and could give a misleading answer for a file with multiple links). It is best to remember the names of files yourself as you open them (perhaps with a wrapper function around fopen).

(кто не читает английский) — вобщем, на вопрос как востановить имя открытого файла — ответ: а никак! Запоминайте в програме что для чего открыто.
Правда, я не понял, причем тут scan of the entire disk — этак, что, можно выяснить какой файл открыт? Я не понял как.

Вообще если сканированием файлов можно выяснить какой файл в данный момент под открытым дескриптором или файл-поинтером, это было бы решением в моей ситуации. Программа гарантированно работает в одной директории, с несущественным количеством файлов.
Кто нибудь понял о чем тут имелось ввиду?

Может все же кто нибудь видит другое по-проще решение?

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL