«Неверный дескриптор файла» на close
обычно означает, что дескриптор уже закрыт. Часто это происходит из-за ошибки двойного закрытия в каком-то совершенно не связанном разделе программы.
Такая ошибка может быть заразной. Если ваша программа закрывает один и тот же дескриптор дважды, и он тем временем перераспределяется, вторая close
закроет дескриптор некоторого несвязанного объекта из-под них. И затем, когда этот объект закрывает свой дескриптор, он может фактически закрывать еще один дескриптор другого объекта ... И так далее, пока последний в строке не получит ошибку "неверный дескриптор файла".
Это побочный эффект (а) дескрипторов, являющихся глобальным состоянием, и (б) требования Unix, что любой вызов open / socket / etc. назначить неиспользуемый дескриптор с наименьшим номером.
Единственный способ отладки, который я знаю, - это мониторинг создания и уничтожения всех файловых дескрипторов с помощью такого инструмента, как strace
(в Linux) или dtrace
(в Mac). (Ну, может быть, не единственный способ. Однажды я написал хитрый LD_PRELOAD
хак, чтобы перехватывать каждый вызов open
и close
, чтобы выяснить, какой поток дважды закрывал их дескриптор, потому что второе закрытие было уничтожением дескриптора используется другим потоком ...)
Удачи.