Я пишу программу на основе проклятий. Чтобы упростить для меня поиск ошибок в этой программе, я хотел бы создать вывод отладки. Из-за того, что программа уже отображает пользовательский интерфейс на терминале, я не могу разместить там отладочный вывод.Как зарезервировать дескриптор файла?
Вместо этого я планирую написать вывод отладки в дескриптор файла 3 безоговорочно. Вы можете вызвать программу как program 3>/dev/ttyX
, а /dev/ttyX
- это другой телетайп, чтобы увидеть выход отладки. Когда дескриптор 3 файла не открывается, сбой записи вызовов с EBADF
, который я игнорирую, как и все ошибки при записи вывода отладки.
Проблема возникает, когда я открываю другой файл, и никакой запрос отладки не запрашивался (т. Е. Дескриптор файла 3 не был открыт). В этом случае вновь открытый файл может получить файловый дескриптор 3, в результате чего вывод отладки приведет к случайному повреждению файла, который я только что открыл. Это плохо. Как я могу избежать этого? Есть ли способ переносить дескриптор файла как «зарезервированный» или такой?
Вот несколько идей, которые я имел и свои проблемы:
- Я мог бы открыть
/dev/null
или временный файл в файл с дескриптором 3 (например, с помощьюdup2()
), прежде чем открыть любой другой файл. Это работает, но я не уверен, могу ли я считать это всегда успешным, так как открытие/dev/null
может не получиться. - Я мог проверить, открыт ли дескриптор файла 3 и не выводить вывод отладки, если он не является. Это проблематично, когда я пытаюсь перезапустить программу, вызвав
exec
, поскольку другой дескриптор файла, возможно, был открыт (и не закрыт) до вызоваexec
. Я мог бы намеренно закрыть дескриптор файла 3 перед вызовомexec
, когда он не был открыт для отладки, но это очень опасно.
Почему это должны быть Fd 3? Почему он должен быть вызван с явным дескриптором из оболочки? Обычным решением является обращение с этим в вашем приложении. Передайте дополнительный вариант, например, --debug-file = FILE в ваше приложение, откройте этот файл и сохраните дескриптор, возвращенный функцией open() внутри, для использования в качестве вывода отладки. – Juliano
@Juliano Потому что это проще, чем реализация дополнительной опции командной строки, а также более простой в использовании (дескриптор файла должен указываться только один раз, а не дважды). – fuz
@FUZxxl * Потому что это проще, чем реализация дополнительной опции командной строки, а также более простой в использовании. * Это, конечно, не так просто. Что произойдет, если что-то еще закончится с 3 в качестве дескриптора файла? –