LINUX.ORG.RU

SIGSEGV


0

0

Друзья! Добрый день! Слышала, что ОС система Linux может послать сигнал SIGSEGV при нехватке памяти, но не могу найти источников, подтверждающих это (кроме замечаний на различных форумах). Утечка памяти является ошибкой сегментации? Не могли бы вы порекомендовать материал или кинуть ссылку. Большое спасибо!:)


Из-за ошибки в программе - вполне.

anon_666 ()
Ответ на: комментарий от anon_666

Спасибо! То есть суть-то вопроса в следующем, посылается ли SIGSEGV при нехватке памяти и где об этом можно почитать, или он вообще относится к ошибкам другого рода? И что тогда делает система в случае утечки памяти?

Masha ()

>Слышала, что ОС система Linux может послать сигнал SIGSEGV при нехватке памяти

Я думал, что в таких случаях просто malloc() возвращает нулину, либо new возвращает нулину, либо кидает ексепшн.

Утечка памяти является ошибкой сегментации?

Нет. Можешь ради эксперимента в цикле 200 раз понавыделять памяти динамически по 100КБ за раз, а указатели на выделенную память нигде не сохранять. И при этом никаких SIGSEGV-ов не будет.

SIGSEGV обычно приходит в гости, когда мы разыменовываем нулевой указатель, или пишем что нибудь по некорректному адресу, или дважды очищаем кусок памяти по одному и тому же указателю. При обращении к «не той» области памяти, например, выход за пределы массива, тоже может прийти SIGSEGV.

anonymous ()
Ответ на: комментарий от Masha

Если памяти нет, malloc возвращает NULL и errno устанавливается в ENOMEM. SIGSEGV — это для других случаев.

undet ()

Документация обычно уже есть в системе — команда man malloc.

undet ()
Ответ на: комментарий от Masha

man 7 signal

SIGSEGV 11 C Обращение к запретной области памяти

annulen ★★★★★ ()
Ответ на: комментарий от anonymous

Я думал, что в таких случаях просто malloc() возвращает нулину, либо new возвращает нулину, либо кидает ексепшн.

man malloc:

By default, Linux follows an optimistic memory allocation strategy. This means that when malloc() returns non-NULL there is no guarantee that the memory really is available. This is a really bad bug. In case it turns out that the system is out of memory, one or more processes will be killed by the infamous OOM killer.

Так что мимо.

vaulter ()

Linux может послать сигнал SIGSEGV при нехватке памяти

Смотрите мой комент выше. Самое плохое, что может случиться — процесс прибьёт OOM killer. Каким сигналом это он сделает, честно говоря не в курсе. Но то, что это SIGSEGV крайне маловероятно.

Думаю, что почитать по теме и так понятно.

vaulter ()
Ответ на: комментарий от vaulter

> when malloc() returns non-NULL there is no guarantee that the memory really is available.

Вот ведь говно, а я и не знал (

melkor217 ★★★★★ ()
Ответ на: комментарий от melkor217

не выражайся при девочках!

// c.: cynicism employment

anonymous ()
Ответ на: комментарий от anonymous

А я ещё не говорил, что линукс гавно?

Толсто, конечно, но фиг с ним.

Я немного «недокопипастил» - в том же мане приводиться заклинание по переводу поведения malloc к каноническому поведению.

Так что, данный момент говорит о гибкости linux, а не его ароматических качествах.

vaulter ()

Если линуксу не хватает памяти, он убивает какой-нибудь ненужный процесс.

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.