Когда вы используете open()
для открытия файла (см. man 2 open
), вы получаете для него файловый дескриптор (это int
в C). Стандартные потоки связаны с дескрипторами 0, 1 и 2, а любой другой поток открытых файлов будет иметь отдельный связанный с ним дескриптор.
Существует ограничение на количество файлов, которые вы можете открыть одновременно, обычно где-то около 512 или 1024 (см. ulimit -Hn
для жесткого верхнего предела), и каждый из этих открытых файлов будет иметь файловый дескриптор, связанный с ними.
Концептуально это просто индекс в массиве, поддерживаемом ядром. Помимо трех стандартных, нет фиксированной связи между файловыми дескрипторами и любым другим потоком.
В журнале, который вы добавили к вопросу, вы видите, что «отрицательные файловые дескрипторы» связаны с кодами ошибок (ENOENT
и EACCESS
). Системный вызов open()
возвращает отрицательные числа для ошибок.
Описание этих кодов ошибок см. в man errno
.
Файловые дескрипторы предназначены для каждого процесса, поэтому файловый дескриптор 6 в процессе A не является тем же потоком, что и файловый дескриптор 6 в процессе B.