9

データ サイズを 65Kb に制限する簡単なプログラムを作成し、65Kb 以上のダミー メモリを割り当てていることを確認するために、(以下のように) すべて正しいことを行っている場合、malloc 呼び出しは失敗するはずですよね?

#include <sys/resource.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

int main (int argc, char *argv[])
{
  struct rlimit limit;


  /* Get max data size . */
  if (getrlimit(RLIMIT_DATA, &limit) != 0) {
    printf("getrlimit() failed with errno=%d\n", errno);
    return 1;
  }

  printf("The soft limit is %lu\n", limit.rlim_cur);
  printf("The hard limit is %lu\n", limit.rlim_max);

  limit.rlim_cur = 65 * 1024;
  limit.rlim_max = 65 * 1024;

  if (setrlimit(RLIMIT_DATA, &limit) != 0) {
    printf("setrlimit() failed with errno=%d\n", errno);
    return 1;
  }

  if (getrlimit(RLIMIT_DATA, &limit) != 0) {
    printf("getrlimit() failed with errno=%d\n", errno);
    return 1;
  }

  printf("The soft limit is %lu\n", limit.rlim_cur);
  printf("The hard limit is %lu\n", limit.rlim_max);
  system("bash -c 'ulimit -a'");
    int *new2 = NULL;
    new2 = malloc(66666666);
    if (new2 == NULL)
    {
        printf("malloc failed\n");
        return;
    }
    else
    {
        printf("success\n");
    }

  return 0;
}

驚いたことに、出力は次のようなものです -

The soft limit is 4294967295
The hard limit is 4294967295
The soft limit is 66560
The hard limit is 66560
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) 65
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 14895
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 14895
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
success

私は何らかの方法で間違っていますか?入力をドロップしてください。ありがとう!

4

2 に答える 2

6

setrlimitのマニュアルページから:

RLIMIT_DATA

プロセスのデータ セグメント (初期化されたデータ、初期化されていないデータ、およびヒープ) の最大サイズ。この制限は、brk(2) および sbrk(2) の呼び出しに影響を与えます。この呼び出しは、このリソースのソフト制限に遭遇するとエラー ENOMEM で失敗します。

具体的には、そのリソースは、 経由で取得したメモリには適用されませんmmapmalloc新しいメモリを取得するために内部でさまざまなメカニズムを使用します。この場合、 ormmapではなく、使用されていることがわかります。を使用してプログラムからシステム コールをダンプすることで、これを確認できます。sbrkbrkstrace

目的を達成するには、RLIMIT_AS代わりにリソースを使用してください。

于 2015-12-28T06:38:02.227 に答える