Дается представление об особенностях использования функций системных библиотек
Описание большей части функций системных библиотек снабжено специальной таблицей в параграфе "Классификация":
- Нет
- Обработчик прерываний
- Да
- Обработчик сигналов
- Нет
- В потоке
- Нет
Таблица подобного вида раскрывает безопасность вызова в различных сценариях:
- Точка остановки потока
- Определяет возможность прерывания исполнения потока во время вызова функции (см. pthread_cancel()).
- Обработчик прерываний
- Определяет возможность безопасного использования функции внутри обработчика прерывания (см. InterruptAttach).
| Если функция небезопасна, то ее вызов из обработчика может привести к фатальным общесистемным последствиям. Последствия в общем случае непредсказуемы и могут включать аварийное завершение случайных процессов и даже процесса procnto-*. В наилучшем сценарии подобного применения негаивный эффект проявится немедленно, в противном случае он будет проявляться в случайные моменты времени и связать его с конкретным обработчиком будет достаточно проблематично. |
- Обработчик сигналов
- Безопасная функция обладает предсказуемым поведением как при вызове внутри обработчика сигналов, так и при прерывании сигналом другой небезопасной функции.
Некоторые из таких функций при неуспешном выполнении модифицируют errno, что необходимо учитывать при написании обработчика сигналов. Для этого следует отдельно сохранять (при входе в обработчик) и восстанавливать (при выходе) errno. В противном случае любой вызов функции, включая библиотечные, может получить асинхронно измененное значение errno, что в общем случае окажется непредсказуемым. - В потоке
- Безопасность использования функции в многопоточных приложениях. Небезопасные функции могут иметь внутренние ресурсы, которые с некоторой вероятностью будут повреждены при ее одновременном вызове из нескольких потоков. Другие небезопасные вызовы могут иметь общий незащищенный ресурс в рамках своего класса функций. Такие функции в общем случае можно защитить отдельно, например, с использованием мьютекса.
| Не является безопасным использование операций с плавающей точкой внутри обработчиков прерывания или сигналов. |
Предыдущий раздел: Руководство разработчика