Ограничение использования памяти для одного процесса в OSX /Darwin

Я пытаюсь изменить код JNI, чтобы ограничить объем памяти, который может использовать процесс. Вот код, который я использую для тестирования setRlimit на Linux и OSX. В Linux это работает как положено, и buf равен нулю.

Этот код устанавливает ограничение в 32 МБ, а затем пытается распределить буфер 64 МБ, если буфер равен нулю, тогда setrlimit работает.

    #include <sys/time.h>
    #include <sys/resource.h>                                                     
    #include <stdio.h>                                                  
    #include <time.h>                                                   
    #include <stdlib.h>                                                  
    #include <unistd.h>                                                   
    #include <sys/resource.h>

    #define errExit(msg)     do { perror(msg); exit(EXIT_FAILURE); \
                                       } while (0)

       int main(int argc) {


        pid_t pid = getpid();

        struct rlimit current;
        struct rlimit *newp;

        int memLimit = 32 * 1024 * 1024;
        int result = getrlimit(RLIMIT_AS, &current);
        if (result != 0)
                errExit("Unable to get rlimit");

        current.rlim_cur = memLimit;
        current.rlim_max = memLimit;

        result = setrlimit(RLIMIT_AS, &current);
        if (result != 0)
                errExit("Unable to setrlimit");


        printf("Doing malloc \n");
        int memSize = 64 * 1024 * 1024;

        char *buf = malloc(memSize);

        if (buf == NULL) {
                printf("Your out of memory\n");
        } else {
                printf("Malloc successsful\n");
        }

        free(buf);
}

На машине linux это мой результат

memtest]$ ./m200k                             
Doing malloc 
Your out of memory

На osx 10.8

./m200k 
Doing malloc 
Malloc successsful

Мой вопрос заключается в том, что если это не работает на OSX, есть ли способ выполнить эту задачу в ядре Дарвина. Все страницы руководства, кажется, говорят, что это будет работать, но, похоже, это не так. Я видел, что launchctl имеет некоторую поддержку для ограничения памяти, но моя цель - добавить эту возможность в код. Я также попытался использовать ulimit, но это тоже не сработало, и я уверен, что ulimit использует setrlimit для установки ограничений. Также есть сигнал, который я могу уловить при превышении setrlimit soft или hardlimit. Я не смог найти один.

Бонусные баллы, если это можно сделать и в Windows.

Спасибо за любой совет

Обновить
Как указывалось выше, RLIMIT_AS явно определяется на странице руководства, но определяется как RLIMIT_RSS, поэтому, если обратиться к документации, RLIMIT_RSS и RLIMIT_AS взаимозаменяемы в OSX.

/usr/include/sys/resource.h для OSX 10.8

#define RLIMIT_RSS      RLIMIT_AS       /* source compatibility alias */

Протестированное отличное предложение trojanfoe использовать RLIMIT_DATA, которое описано здесь

    The RLIMIT_DATA limit specifies the maximum amount of bytes the process
 data segment can occupy. The data segment for a process is the area in which 
 dynamic memory is located (that is, memory allocated by malloc() in C, or in C++,
 with new()). If this limit is exceeded, calls to allocate new memory will fail. 

Результат был одинаковым для Linux и OSX, и это был malloc был успешным для обоих.

chinshaw@osx$ ./m200k 
Doing malloc 
Malloc successsful


chinshaw@redhat ./m200k
Doing malloc 
Malloc successsful

0 ответов

Другие вопросы по тегам