2

我正在尝试修改一些 JNI 代码以限制进程可以消耗的内存量。这是我用来在 linux 和 osx 上测试 setRlimit 的代码。在 linux 中,它按预期工作,并且 buf 为空。

此代码将限制设置为 32 MB,然后尝试分配 64 MB 缓冲区,如果缓冲区为空,则 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 上不起作用,是否有办法在 darwin 内核中完成这项任务。手册页似乎都说它会起作用,但似乎没有这样做。我已经看到 launchctl 对限制内存有一些支持,但我的目标是在代码中添加这种能力。我也尝试使用 ulimit ,但这也不起作用,我很确定 ulimit 使用 setrlimit 来设置限制。当超过 setrlimit soft 或 hardlimit 时,我还能捕捉到信号吗?我一直找不到。

如果它也可以在 Windows 中完成,则可以加分。

感谢您的任何建议

更新
正如指出的那样,RLIMIT_AS 在手册页中明确定义,但被定义为 RLIMIT_RSS,因此如果参考文档,RLIMIT_RSS 和 RLIMIT_AS 在 OSX 上是可互换的。

osx 10.8 上的 /usr/include/sys/resource.h

#define RLIMIT_RSS      RLIMIT_AS       /* source compatibility alias */

测试了特洛伊木马对使用此处描述的 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
4

0 回答 0