Когда процесс получает SIGABRT (сигнал 6)?

187
задан Shree 4 August 2010 в 22:17
поделиться

5 ответов

abort () отправляет вызывающему процессу сигнал SIGABRT , так в основном работает abort () .

abort () обычно вызывается библиотечными функциями, которые обнаруживают внутреннюю ошибку или какое-либо серьезно нарушенное ограничение. Например, malloc () вызовет abort () , если его внутренние структуры повреждены переполнением кучи.

178
ответ дан 23 November 2019 в 05:47
поделиться

Я дам свой ответ от конкурентоспособное программирование (CP) перспектива, но это относится к другим доменам также.

Много времена при выполнении CP, ограничения являются довольно большими.

, Например : у Меня был вопрос с переменные N, M, Q таким образом что 1 ≤ N, M, Q < 10^5 .

ошибка, которую я делал, была, я объявил 2D целочисленный массив размера 10000 x 10000 в C++ и боролся с SIGABRT ошибка в Codechef в течение почти 2 дней.

Теперь, если мы вычисляем:

Типичный размер целого числа: 4 байта

номер ячеек в нашем массиве: 10000 x 10000

Общий размер (в байтах): 400 000 000 байтов = 4*10^8 в‰ МБ за 400€

Ваши решения таких вопросов будут работать над Вашим ПК (не всегда), поскольку он может предоставить этот размер.

, Но ресурсы при кодировании сайтов (судьи онлайн) ограничен немногими KBS.

Следовательно, SIGABRT ошибка и другие такие ошибки.

Заключение:

В таких вопросах, мы не должны объявлять массив или вектор или любой другой DS этого размера, но наша задача состоит в том, чтобы сделать наш алгоритм таким эффективным, что это работает без них (DS) или с меньшей памятью.

PS: могли бы быть другие причины этой ошибки; выше был один из них.

0
ответ дан 23 November 2019 в 05:47
поделиться

Как "@sarnold", точно указанный, любой процесс может отправить сигнал в любой другой процесс, следовательно, один процесс может отправить SIGABORT в другой процесс & в этом случае процесс получения не может различать, есть ли его прибытие из-за его собственной тонкой настройки памяти и т.д., или у кого-то еще "unicastly", отправьте к нему.

В одной из систем я работал существует один детектор мертвой блокировки, который на самом деле обнаруживает, если процесс выходит из некоторой задачи путем предоставления сердцебиения или нет. В противном случае затем это объявляет, что процесс находится в мертвой блокировке, указывают, и отправляет SIGABORT в него.

я просто хотел совместно использовать это предполагаемое со ссылкой на вопрос, который задают.

0
ответ дан 23 November 2019 в 05:47
поделиться

Вы можете отправить любой сигнал любому процессу, используя интерфейс kill (2) :

kill -SIGABRT 30823

30823 был ] dash я запустил, чтобы легко найти процесс, который я хотел убить.

$ /bin/dash
$ Aborted

Вывод Aborted , по-видимому, представляет собой то, как тире сообщает SIGABRT.

Его можно отправить напрямую любому процессу, используя kill (2) , или процесс может отправить сигнал самому себе через assert (3) , abort (3 ) или поднять (3) .

49
ответ дан 23 November 2019 в 05:47
поделиться

SIGABRT обычно используется libc и другими библиотеками для прерывания программы в случае критических ошибок. Например, glibc отправляет SIGABRT в случае обнаружения двойного освобождения или других повреждений кучи.

Кроме того, большинство реализаций утверждения используют SIGABRT в случае неудачного утверждения.

Кроме того, SIGABRT может быть отправлен из любого другого процесса, как и любой другой сигнал. Конечно, процесс отправки должен запускаться от имени того же пользователя или root.

48
ответ дан 23 November 2019 в 05:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: