Вам также необходимо установить пакет redux
. Выполните:
npm install --save redux
На большинстве архитектур, которые я использовал, различие состоит в том, что:
Я предполагаю, что вы говорите о сигналах SIGSEGV
и SIGBUS
, определенных Posix.
SIGSEGV
происходит, когда программа ссылается неверный адрес. SIGBUS
является аппаратной ошибкой, определяемой реализацией. Действие по умолчанию для этих двух сигналов - завершение программы.
Программа может перехватывать эти сигналы и даже игнорировать их.
Например, ошибка шины может быть вызвана тем, что ваша программа пытается сделать то, что аппаратная шина не поддерживает. Например, в SPARC при попытке прочитать многобайтовое значение (например, 32-битное значение int) с нечетного адреса возникла ошибка шины.
Ошибки сегментации происходят, например, когда вы делаете доступ, который нарушает правила сегментации, то есть пытается читать или записывать память, которой вы не владеете.
SIGBUS
также будет активирован, если вы mmap ()
файл и попытаться получить доступ к части сопоставленного буфера, которая выходит за пределы конца файла, а также в случае возникновения ошибок, таких как нехватка места. Если вы зарегистрируете обработчик сигнала с помощью sigaction ()
и зададите SA_SIGINFO
, возможно, ваша программа будет проверять адрес памяти, вызвавший сбой, и обрабатывать только ошибки файлов с отображением памяти. ]
Интерпретируя ваш вопрос (возможно, неверно) как означающий «Я периодически получаю SIGSEGV или SIGBUS, почему это не согласованно?», Стоит отметить, что делать хитрые вещи с указателями нельзя гарантировано стандартами C или C ++, что приведет к сбою в сегменте; это просто «неопределенное поведение», которое, как я однажды выразился профессором, означает, что вместо этого оно может заставить крокодилов вылезти из полов и съесть вас.
Так что ваша ситуация может быть так, что у вас есть две ошибки, из которых первый происходят иногда вызывает SIGSEGV, а второй (если segfault не произошел и программа все еще работает) вызывает SIGBUS.
Я рекомендую вам выполнить отладчик и остерегаться крокодилов .
Это было бы дублированием Что такое ошибка шины? , если бы не t для
Может ли случиться так, что программа выдает ошибку сегмента и останавливается в первый раз, а во второй раз может выдать ошибку шины и выйти?
часть вопроса. Вы должны сами ответить на этот вопрос с помощью информации, найденной здесь.
Безумие: делать одно и то же снова и снова и ожидать разных результатов.
- Альберт Эйнштейн
Конечно, если принять вопрос буквально ...
#include <signal.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
int main() {
srand(time(NULL));
if (rand() % 2)
kill(getpid(), SIGBUS);
else
kill(getpid(), SIGSEGV);
return 0;
}
Tada, программа, которая может завершиться с ошибкой сегментации при одном запуске и выйти с ошибкой шины при другом запуске.