Get/Set process resource limits in C - GeeksforGeeks

17 Dec, 2018
The getrlimit() and setrlimit() system calls can be used to get and set the resource limits such as files, CPU, memory etc. associated with a process.
Each resource has an associated soft and hard limit.
soft limit: The soft limit is the actual limit enforced by the kernel for the corresponding resource.
hard limit: The hard limit acts as a ceiling for the soft limit.
The soft limit ranges in between 0 and hard limit.
The two limits are defined by the following structure
struct rlimit {    rlim_t rlim_cur;  /* Soft limit */    rlim_t rlim_max;  /* Hard limit (ceiling for rlim_cur) */};
The signatures of the system calls are
int getrlimit(int resource, struct rlimit *rlim);int setrlimit(int resource, const struct rlimit *rlim);
resource refers to the resource limits you want to retrieve or modify.To set both the limits, set the values with the new values to the elements of rlimit structure.To get both the limits, pass the address of rlim. Successful call to getrlimit(), sets the rlimit elements to the limits.On success, both return 0. On error, -1 is returned, and errno is set appropriately.
Here, is a program demonstrating the system calls by changing the value one greater than the maximum file descriptor number to 3.
// C program to demonstrate working of getrlimit() // and setlimit()#include <stdio.h>#include <sys/resource.h>#include <string.h>#include <errno.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>  int main() {      struct rlimit old_lim, lim, new_lim;      // Get old limits    if( getrlimit(RLIMIT_NOFILE, &old_lim) == 0)        printf("Old limits -> soft limit= %ld \t"           " hard limit= %ld \n", old_lim.rlim_cur,                                  old_lim.rlim_max);    else        fprintf(stderr, "%s\n", strerror(errno));          // Set new value    lim.rlim_cur = 3;    lim.rlim_max = 1024;      // Set limits    if(setrlimit(RLIMIT_NOFILE, &lim) == -1)        fprintf(stderr, "%s\n", strerror(errno));          // Get new limits    if( getrlimit(RLIMIT_NOFILE, &new_lim) == 0)        printf("New limits -> soft limit= %ld "         "\t hard limit= %ld \n", new_lim.rlim_cur,                                   new_lim.rlim_max);    else        fprintf(stderr, "%s\n", strerror(errno));    return 0;}
Output:
Old limits -> soft limit= 1048576      hard limit= 1048576 
New limits -> soft limit= 3              hard limit= 1024

The Old limits values may vary depending upon the system.
Now, If you try to open a new file, it will show run time error, because maximum 3 files can be opened and that are already being opened by the system(STDIN, STDOUT, STDERR).
// C program to demonstrate error when a // process tries to access resources beyond// limit.#include <stdio.h>#include <sys/resource.h>#include <string.h>#include <errno.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>  int main() {      struct rlimit old_lim, lim, new_lim;      // Get old limits    if( getrlimit(RLIMIT_NOFILE, &old_lim) == 0)        printf("Old limits -> soft limit= %ld \t"          " hard limit= %ld \n", old_lim.rlim_cur,                               old_lim.rlim_max);    else        fprintf(stderr, "%s\n", strerror(errno));      // Set new value    lim.rlim_cur = 3;    lim.rlim_max = 1024;            // Set limits    if(setrlimit(RLIMIT_NOFILE, &lim) == -1)        fprintf(stderr, "%s\n", strerror(errno));          // Get new limits    if( getrlimit(RLIMIT_NOFILE, &new_lim) == 0)        printf("New limits -> soft limit= %ld \t"          " hard limit= %ld \n", new_lim.rlim_cur,                                 new_lim.rlim_max);    else        fprintf(stderr, "%s\n", strerror(errno));          // Try to open a new file    if(open("foo.txt", O_WRONLY | O_CREAT, 0) == -1)        fprintf(stderr, "%s\n", strerror(errno));    else            printf("Opened successfully\n");          return 0;}
Output:
Old limits -> soft limit= 1048576      hard limit= 1048576
New limits -> soft limit= 3                      hard limit= 1024
Too many open files
man 2 prlimit
system-programming
Technical Scripter 2018
C Programs
Operating Systems
Operating Systems
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
C Program to read contents of Whole File
Header files in C/C++ and its uses
Program to print ASCII Value of a character
How to return multiple values from a function in C or C++?
How to Append a Character to a String in C
Types of Operating Systems
Banker's Algorithm in Operating System
Page Replacement Algorithms in Operating Systems
Program for FCFS CPU Scheduling | Set 1
Paging in Operating System