У меня есть немного кода, который обрабатывает сигналы POSIX, и как часть этого (для обеспечения безопасности сигнала) выполняет системный вызов sem_post () (согласно http://man7.org/linux/man-pages/man3/sem_post.3.html 'async signal safe').
Но когда я запускаю этот код - очень редко я получаю жалобу на дезинфицирующее средство потока:
РЕЗЮМЕ: ThreadSanitizer: обработчик сигнала портит errno / home / lewis / Sandbox / Stroika-Build-Dir-Ubuntu1804_x86_64/Library/Sources/Stroika/Foundation/Execution/SignalHandlers.cpp:497 в Стройке :: Foundation :: Execution :: SignalHandlerRegistry :: FirstPassSignalHandler_ (int)
Я полагаю, это связано с вызовом sem_post,который может INDEED перезаписать errno.
И да - это может действительно испортить другой поток, если это произошло в правильное (неправильное?) время.
Я всегда находил 'локальный потокМеханизм errno - удобный способ обработки ошибок, но я только сейчас понимаю, насколько опасно это для кода обработки сигналов.
Есть ли способ вызывать системные вызовы БЕЗ перезаписи errno?Что-нибудь, по крайней мере, смутно переносимое?
Даже http://man7.org/linux/man-pages/man2/syscall.2.html - говорит, что сохраняет результат в errno.