Qt: Broken Pipe (18.06.2025). |
![]() |
2025 - Июнь | |||
18.06.2025 00:00 | |||
Кодишь-кодишь в Qt v.5.3 на Astra SE v.1.4, никого не трогаешь. Создаешь PDF через QPrinter. Вдруг, при работе программа останавливается и орёт: "Broken Pipe!". При этом, если продолжить работу исходников, - PDF создаётся корректно - вообще вся программа работает корректно - вообще всё работает корректно. Причина возникновения ошибки, условия её выполнения - также неизвестны; то всплывает, то не всплывает. И вплывает она только в режиме дебага - для клиента не покажется никогда. Выбешивала просто невероятно - её убийство стало делом принципа, оказалось относительно простым.
Чтобы убрать это досадное недоразумение, подключается signal.h и пишется именно 4 строчки (а не 1 или 3, предлагаемые интернетом): sigset_t set; sigemptyset(&set); sigaddset(&set, SIGPIPE); qDebug() << "formular_xxx: vPrint_PDF: результат блокировки сигнала Broken Pipe - " << pthread_sigmask(SIG_BLOCK, &set, NULL); //0 - блокировка выполнена. Результат выполнения блокировки, а не проверка выставленной блокировки. А вот проверка блокировки сигнала (проверка работоспособности исходников выше) - проблема не только потому, что ошибка всплывает рэндомно и именно при дебаге. Если вдруг блокировка не сработала, и вызвать Broken Pipe принудительно, - это будет форменным мазохизмом при работе. Поэтому, результат блокировки проверялся на другом ПК и с другим сигналом SIGTERM. Если в системном мониторе сделать попытку закрытия приложения путём завершения (Ctrl+T) - при блокированном SIGTERM системный монитор тупо не прервёт именно это конкретное приложение. |
|||
Обновлено ( 18.06.2025 12:13 ) |