Подтвердить что ты не робот

Если с помощью EIO не удается закрыть (2), будет ли файл дескриптор удаляться?

Если системный вызов close (2) не выполняется с EIO, будет ли файл дескриптор удаляться?

Если да, невозможно ли обрабатывать ложную ошибку ввода-вывода, повторив позже? Если нет, как предотвратить утечку файлового дескриптора?

4b9b3361

Ответ 1

Это сложный вопрос. Однако стандарт POSIX охватывает его в описании close():

Если close() прерывается сигналом, который должен быть пойман, он должен возвращать -1 с errno, установленным в [EINTR], и состояние fildes неуказано. Если во время чтения или записи в файловую систему произошла ошибка ввода-вывода во время закрытия(), она может возвращать -1 с errno, установленным в [EIO]; если эта ошибка возвращена, состояние fildes не указано.

Таким образом, состояние дескриптора файла не определено стандартом.

Для большинства практических целей он закрыт; есть очень мало, что вы можете сделать с файловым дескриптором, даже если он официально открыт. Вы можете попробовать безобидную операцию (например, fcntl() и F_GETFL) и посмотреть, вернете ли вы EBADF, указав, что дескриптор официально закрыт. Но если он открыт и причина ошибки EIO постоянна, вы, вероятно, получите EIO каждый раз, когда пытаетесь что-либо сделать с ним (возможно, включая вызов fcntl()). Вы могли бы или не могли бы получить тот же дескриптор, который был возвращен другой открытой операции. Непонятно, что даже dup2() может быть успешным, указав дескриптор файла "мертвый" в качестве цели, если дескриптор мертвого файла открыт, но не закрыт.