Jes
Jes

Reputation: 2694

setrlimit doesn't work on restricting the maximum amount of memory

I am learning linux resource control using setrlimit and getrlimit. The idea is to limit the maximum amount of memory that can be used for a given process:

#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("\n Default value is : %lld\n", (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("\n Default value now is : %lld\n", (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("\n Memory allocation failed\n"); 
      return -1; 
  }   

  printf("pass\n");

  free(ptr); 

  return 0;  
}

The above code limit the memory to 100 bytes (both soft and hard). However, the malloc still returns without error. Is there anything wrong with the code? The output I got is:

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

Upvotes: 1

Views: 1594

Answers (1)

enclaved
enclaved

Reputation: 21

No, there's nothing wrong with your code. You're only wrong to assume that RLIMIT_AS has an immediate effect on malloc(). In a nutshell, the latter (usually, there are many variations) allocates its backing memory in chunks from heap with brk() or on-demand-mapped pages with mmap() and then carves those chunks into individual allocations. The chances are there was already enough space allocated in heap to satisfy your malloc() call, whereas your new RLIMIT_AS would affect only subsequent calls for brk() and mmap(). All in all, it is perfectly normal.

Upvotes: 2

Related Questions