Кроме того, это файл дескрипторы , а не файл дескрипторы . Последние являются функцией C, используемой с fopen
и его братьями, тогда как дескрипторы более UNIXy, для использования с open
и др.
Интересно. Единственная причина, которая приходит на ум, заключается в том, что какой-то другой фрагмент кода имеет конкретную потребность в том, чтобы дескриптор файла был 256. Я подозреваю, что только Oracle узнает причину этого странного. В любом случае, вы не гарантированно получите 256, вы получите файл с первым доступным дескриптором файла, большим или равным этому числу.
Из небольшого исследования (я не знаю каждую небольшую вещь о внутренностях UNIX на моей голове), есть атрибуты, которые принадлежат группе дублированных дескрипторов, таких как файл положение и режим доступа. Существуют и другие атрибуты, принадлежащие файловому дескриптору single , даже при дублировании, например, флаг close-on-exec в 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
и и так далее).