abort ()
отправляет вызывающему процессу сигнал SIGABRT
, так в основном работает abort ()
.
abort ()
обычно вызывается библиотечными функциями, которые обнаруживают внутреннюю ошибку или какое-либо серьезно нарушенное ограничение. Например, malloc ()
вызовет abort ()
, если его внутренние структуры повреждены переполнением кучи.
Я дам свой ответ от конкурентоспособное программирование (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: могли бы быть другие причины этой ошибки; выше был один из них.
Как "@sarnold", точно указанный, любой процесс может отправить сигнал в любой другой процесс, следовательно, один процесс может отправить SIGABORT в другой процесс & в этом случае процесс получения не может различать, есть ли его прибытие из-за его собственной тонкой настройки памяти и т.д., или у кого-то еще "unicastly", отправьте к нему.
В одной из систем я работал существует один детектор мертвой блокировки, который на самом деле обнаруживает, если процесс выходит из некоторой задачи путем предоставления сердцебиения или нет. В противном случае затем это объявляет, что процесс находится в мертвой блокировке, указывают, и отправляет SIGABORT в него.
я просто хотел совместно использовать это предполагаемое со ссылкой на вопрос, который задают.
Вы можете отправить любой сигнал любому процессу, используя интерфейс kill (2)
:
kill -SIGABRT 30823
30823 был ] dash
я запустил, чтобы легко найти процесс, который я хотел убить.
$ /bin/dash
$ Aborted
Вывод Aborted
, по-видимому, представляет собой то, как тире
сообщает SIGABRT.
Его можно отправить напрямую любому процессу, используя kill (2)
, или процесс может отправить сигнал самому себе через assert (3)
, abort (3 )
или поднять (3)
.
SIGABRT
обычно используется libc и другими библиотеками для прерывания программы в случае критических ошибок. Например, glibc отправляет SIGABRT
в случае обнаружения двойного освобождения или других повреждений кучи.
Кроме того, большинство реализаций утверждения
используют SIGABRT
в случае неудачного утверждения.
Кроме того, SIGABRT
может быть отправлен из любого другого процесса, как и любой другой сигнал. Конечно, процесс отправки должен запускаться от имени того же пользователя или root.