Обработка ошибок, когда ОС не хватает памяти для выделения в C

#c #malloc #out-of-memory

#c #malloc #нехватка памяти

Вопрос:

Я выполняю задачу с интенсивным использованием памяти. Я хотел бы добавить предупреждающее сообщение, когда операционной системе не хватает выделяемой памяти. Когда я запускаю приведенный ниже код, процесс завершается, и мой if statement for, когда указатель равен NULL , не работает.

 #include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define ONEGB (1<<30)

int main() {
        int count=0;

        while(1) {
                int *p = malloc(ONEGB);
                if (p == NULL) {
                        printf("There is not much memory left after %d GBn", count);
                        return 0;
                }
                memset(p,1,ONEGB);
                fprintf(stderr, "got %d GBn",   count);
        }
}
 

Вывод был

 ...
got 25 GB
got 26 GB
got 27 GB
Killed
 

Есть ли какой-либо другой способ сообщить пользователю, что памяти не осталось, прежде чем ОС завершит процесс? В основном меня интересует запуск этого только на серверах Linux.

Комментарии:

1. Интересно, можете ли вы прокомментировать memset(p,1,ONEGB); и посмотреть?

2. Если я закомментирую memset, он выделяет 131 ТБ, прежде чем остановится, и печатает сообщение об ошибке.

3. Это в любом случае неправильно, я не думаю, что у вас так много памяти, у вас должно быть keep memset , я просто хотел увидеть, как вы получаете ошибку. возможно, ОС играет здесь какую-то роль, давайте подождем каких-либо хороших ответов

4. Читайте о ООМ-убийце unix.stackexchange.com/questions/153585 /…