Код: Выделить всё
// Static definition of the semaphore object. This semaphore object is
// declared as a static array of 32 bytes in class A
uint8_t A::semaphore[sizeof(sem_t)];
-----------------------------------------------------------------------
// In int main()
if(sem_init ((sem_t *) A::semaphore, 0, 0)) {
// failed to initialize semaphore
}
printf("semaphore = %p\n", A::semaphore); // Prints 0x129ba01
// Create another thread(s) to execute work
// Main thread gets blocked here... until thread(s) complete their work.
sem_wait ((sem_t *) A::semaphore);
// Once main thread gets unblocked, return from int main() with return value
< /code>
Я также прикрепил свой собственный обработчик исключений, используя SigAction. Оказывается, что, когда основной поток достигает sem_wait, мой обработчик исключений используется со значением номера сигнала 7, которое является исключением Sigbus Код: Выделить всё
// Exception handler belonging to Class B
void B::handleException(int32_t signum, siginfo_t * info, void * context) noexcept
{
printf("signo = %d\n", info->si_signo); // Prints 7
printf("errno = %d\n", info->si_errno);
printf("code = %d\n", info->si_code);
printf("si_addr = %p\n", info->si_addr); // Prints 0x129ba01
....
}
Например, доступ к недопустимому памяти, который вызывает доставку Sigsegv на одну архитектуру ЦП может привести к доставке Sigbus на другую архитектуру, или наоборот. Sigsegv Исключение ... и есть некоторое нарушение доступа к памяти ... но я не могу его найти.
Чего мне здесь не хватает?
Примечание: Sigbus < /code> бросается только на Linux Arm64. Мое приложение отлично работает на Linux X64.
Подробнее здесь: https://stackoverflow.com/questions/790 ... -exception
Мобильная версия