Вопрос

Я проследил процесс оракула и обнаружил, что он сначала открывает файл /etc/netconfig как дескриптор файла 11, а затем дублируйте его как 256 позвонив fcntl с параметром F_DUPFD, а потом close исходный дескриптор файла 11.Позже он прочитал с использованием дескриптора файла 256.Так какой же смысл дублировать дескриптор файла?Почему бы просто не поработать с исходным дескриптором файла?

12931:   0.0006 open("/etc/netconfig", O_RDONLY|O_LARGEFILE)    = 11
12931:   0.0002 fcntl(11, F_DUPFD, 0x00000100)                  = 256
12931:   0.0001 close(11)                                       = 0
12931:   0.0002 read(256, " # p r a g m a   i d e n".., 1024)   = 1024
12931:   0.0003 read(256, " t s           t p i _ c".., 1024)   = 215
12931:   0.0002 read(256, 0x106957054, 1024)                    = 0
12931:   0.0001 lseek(256, 0, SEEK_SET)                         = 0
12931:   0.0002 read(256, " # p r a g m a   i d e n".., 1024)   = 1024
12931:   0.0003 read(256, " t s           t p i _ c".., 1024)   = 215
12931:   0.0003 read(256, 0x106957054, 1024)                    = 0
12931:   0.0001 close(256)                                      = 0
Это было полезно?

Решение

Как в сторону, они файл дескрипторы а не файл обрабатывать. Отказ Последние являются функциями C, используемой с fopen и его братья, а дескрипторы более Unixy, для использования с open и другие.

Интересно. Единственная причина, приходящая к уму, что какой-то другой кусок кода имеет определенную потребность в дескрипторе файлов 256. Я подозреваю, что только Oracle будет знать причудливые причины для этого. В любом случае, вы не гарантируетесь получить 256, вы получаете файл первый доступный дескриптор файла, больше или равен этому номеру.


Из немного расследования (я не знаю каждый Маленькая вещь о внутренности Unix с верхней части головы), есть атрибуты, которые принадлежат к группе дублированных дескрипторов, таких как положение файлов и режим доступа. Есть и другие атрибуты, которые принадлежат Один Файловый дескриптор, даже при дублировании, например, флаг в Gnulib.

Делать дубликат (либо с dup, dup2 или ваш fcntl) Может быть способ создать два дескрипторов, один с различными атрибутами дескриптора файлов, но я не вижу, что имеется дело в вашем вопросе, так как первый дескриптор закрыт в любом случае. Как вы говорите, почему бы не просто использовать низкий дескриптор?

Интересно достаточно, если вы Google для netconfig f_dupfd, вы увидите похожие следы, где fcntl Не удается, и он продолжает читать этот файл с низким дескриптором, поэтому мои мысли по этому вопросу состоят в том, что это попытка максимально возможной сохранить низкие файловые дескрипторы. Например:

4327:   open("/etc/netconfig", O_RDONLY|O_LARGEFILE)    = 4
4327:   fcntl(4, F_DUPFD, 0x00000100)                   Err#22 EINVAL
4327:   read(4, " # p r a g m a   i d e n".., 1024)     = 1024
4327:   read(4, " t s           t p i _ c".., 1024)     = 215
4327:   read(4, 0x00296B80, 1024)                       = 0
4327:   lseek(4, 0, SEEK_SET)                           = 0
4327:   read(4, " # p r a g m a   i d e n".., 1024)     = 1024
4327:   read(4, " t s           t p i _ c".., 1024)     = 215
4327:   read(4, 0x00296B80, 1024)                       = 0
4327:   close(4)                                        = 0

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

Но на самом деле, это просто догадки по моей части (хотя я хотел бы думать, что это относительно умные догадки). Также имейте в виду, что это может быть не сам Oracle, который делает это. Материал NetConfig используется во многих местах, поэтому может быть некоторая базовая библиотека, занимающаяся тем, что особенно в свете того факта, что большинство вышеупомянутых веб-хитов не было специфична Oracle (ftp, remsh и так далее).

Другие советы

В некоторых системах, таких как Solaris, стандартный ввод / вывод с файлом работает только с файловыми дескрипторами 0-255, потому что его реализация файловой структуры использует 8-битное целое число вместо INT. Если программа использует множество файловых дескрипторов, полезно резервировать дескрипторы файлов 3-255 с помощью FNCTL (FD, F_DUPFD, 256). В противном случае функции, такие как FOPEN (), FREOPEN () и FDOPEN (), потерпят неудачу, если у вас открыты 256 файлов.

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

Предположим, что процесс открывает большое количество файловых дескрипторов, например.он принимает более 1024 одновременных подключений к сокетам.В то же время процесс также использует стороннюю библиотеку, которая открывает соединения сокетов и использует select() чтобы узнать, готовы ли сокеты к чтению или записи.Кроме того, сторонняя библиотека была скомпилирована с помощью __FD_SETSIZE установлено значение 1024 (значение по умолчанию).

Если библиотека открывает сокет, когда используются все файловые дескрипторы ниже 1024, то она получит дескриптор, который select() и связанные с ним макросы FD_* не справляются.Это приведет к сбою процесса или неопределенному поведению.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top