Ох, мужики, это опасное дело -- вызывать файловые операции в обработчике прерываний.
Всё зависит от реентерабельности этих самых функций -- если они на середине вывода имеют половину служебных переменных в стеке, половину глобальных, и тут влазит новый вызов, который окончится ранее продолжения старого, х.з. что там по окончании обоих намешается... В мануалах надо искать положительные разрешения, и вряд ли Альтерцы закладывали много мозгов в свой детский проц.
В каких-то конкретных проверенных нечастых случаях для отладки может и можно, но осторожно, и потом сразу лучше наложить табу обратно

Ведь если число желаемых символов по каналу за 1 с превысит его пропускную способность, где-то кого-то кто-то перетрёт в буферах или отбросится в лучшем случае.
В настоящих многозадачных ОС обычно для обработчиков семафоры ждать запрещается, файлы трогать тем более, надо сигналить куда-то семафором или в переменную, записывать всю ситуацию в глобальные переменные, тикать побыстрее, а потом снаружи в нормальном потоке разбираться и сливать инфу без спешки. А если сама функция вывода использует прерывания для обратной сигнализации, то фиг вообще первое прерывание закончится с принтфом

Если прерываний несколько разных, то обычно они отсортированы по приоритету, и то же самое произойти не может уже в обработчике, но более крутое запросто. И такие хитроглюки могут прятаться редкие... Я у себя в проектах стараюсь обходиться без прерываний -- поллинг вполне годится для 99% задач, плюс верифицируется и отлаживается на порядки проще.