Каков размер в битах дескриптора файла в системе x64 под управлением Ubuntu 19.10? - PullRequest
2 голосов
/ 01 марта 2020

Каков размер в битах дескриптора файла, такого как стандартный ввод и стандартный вывод, это 32-разрядное целое число?

1 Ответ

4 голосов
/ 01 марта 2020

Если вы говорите о фактических файловых дескрипторах, возвращаемых (и используемых для) Linux системных вызовов, то взгляните на справочную страницу для open et c. как предлагает @JonathanLeffler.

Например:

int open(const char *pathname, int flags);

Возвращаемое значение open() - это дескриптор файла, небольшое неотрицательное целое число, которое используется в последующих системных вызовах , [...] Файловым дескриптором, возвращаемым при успешном вызове, будет дескриптор файла с наименьшим номером, который в данный момент не открыт для процесса.

Учитывая, что Unix -подобные системы являются LP64, int и, следовательно, файловые дескрипторы имеют ширину 32 бита.

Однако учтите, что ядро ​​выдаст вам как можно меньше целых чисел и , которых вы обычно достигнете предельным способом до этого ( см. Ограничения на количество файловых дескрипторов ) либо из-за глобального ограничения ядра, либо из-за мягких / жестких ограничений.

Это означает, что если вам действительно это нужно теоретически вы можете использовать меньшее целое число для хранения файловых дескрипторов, например int16_t или int8_t (при условии, что ваш процесс не использует столько дескрипторов файлов одновременно).


Если вместо этого вы имеете в виду stdin et c., Это не дескрипторы файлов, а файловые потоки, определенные стандартом C.

Это макросы, которые расширяются до выражений с указателем t Тип (FILE *) и указатели в типичной 64-битной платформе, такой как x86_64, имеют ширину 64 бит.

См. 7.21p3 (Ввод / вывод <stdio.h>):

stdin
stdout
stderr

, которые являются выражениями типа '' указатель на FILE '', которые указывают на FILE объекты, связанные соответственно со стандартной ошибкой, входными и выходными потоками.

...