какова цель fcntl с параметром F_DUPFD
-
26-09-2019 - |
Вопрос
Я проследил процесс оракула и обнаружил, что он сначала открывает файл /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_* не справляются.Это приведет к сбою процесса или неопределенному поведению.