setrlimit не работает над ограничением максимального объема памяти

Я изучаю управление ресурсами linux с использованием setrlimitи getrlimit. Идея состоит в том, чтобы ограничить максимальный объем памяти, который может быть использован для данного процесса:

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

int main () 
{ 
  // Define and object of structure 
  // rlimit. 
  struct rlimit rl; 

  // First get the limit on memory 
  getrlimit (RLIMIT_AS, &rl); 

  printf("
 Default value is : %lld
", (long long int)rl.rlim_cur); 

  // Change the limit 
  rl.rlim_cur = 100; 
  rl.rlim_max = 100; 

  // Now call setrlimit() to set the  
  // changed value. 
  setrlimit (RLIMIT_AS, &rl); 

  // Again get the limit and check 
  getrlimit (RLIMIT_AS, &rl); 

  printf("
 Default value now is : %lld
", (long long int)rl.rlim_cur); 

  // Try to allocate more memory than the set limit 
  char *ptr = NULL; 
  ptr = (char*) malloc(65536*sizeof(char)); 
  if(NULL == ptr) 
  {   
      printf("
 Memory allocation failed
"); 
      return -1; 
  }   

  printf("pass
");

  free(ptr); 

  return 0;  
}

Приведенный выше код ограничивает память до 100 байт (как мягких, так и жестких). Однако, mallocвсе равно возвращается без ошибок. Что-то не так с кодом? Выход, который я получил:

Default value is : -1
Default value now is : 100
pass

resources,setrlimit,

0

Ответов: 1


1

Нет, в коде нет ничего плохого. Вы ошибаетесь, полагая, что это RLIMIT_ASимеет немедленный эффект malloc(). В двух словах, последний (обычно, есть много вариантов) выделяет свою резервную память в кусках из кучи с brk()отображенными по запросу страницами, mmap()а затем вырезает эти куски в отдельные распределения. Шансы на то, что в вашем куче уже достаточно места, чтобы удовлетворить ваш malloc()вызов, в то время как ваш новый RLIMIT_ASбудет влиять только на последующие вызовы brk()и mmap(). В целом, это совершенно нормально.

ресурсы, setrlimit,