Obtener/Establecer límites de recursos de proceso en C

Las llamadas al sistema getrlimit() y setrlimit() se pueden usar para obtener y establecer los límites de recursos, como archivos, CPU, memoria, etc. asociados con un proceso.

Cada recurso tiene un límite blando y duro asociado.

  • límite flexible : el límite flexible es el límite real impuesto por el kernel para el recurso correspondiente.
  • límite duro : El límite duro actúa como techo para el límite suave.

El límite suave oscila entre 0 y el límite duro.

Los dos límites están definidos por la siguiente estructura

struct rlimit {
    rlim_t rlim_cur;  /* Soft limit */
    rlim_t rlim_max;  /* Hard limit (ceiling for rlim_cur) */
};

Las firmas de las llamadas al sistema son

int getrlimit(int resource, struct rlimit *rlim);
int setrlimit(int resource, const struct rlimit *rlim);

recurso se refiere a los límites de recursos que desea recuperar o modificar.
Para establecer ambos límites, establezca los valores con los nuevos valores para los elementos de la estructura rlimit.
Para obtener ambos límites, pase la dirección de rlim. Llamada exitosa a getrlimit(), establece los elementos rlimit en los límites.
En caso de éxito , ambos devuelven 0 . En caso de error , se devuelve -1 y errno se establece de forma adecuada.

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;
}

Producción:

Old limits -> soft limit= 1048576      hard limit= 1048576 
New limits -> soft limit= 3              hard limit= 1024

Los valores de los límites antiguos pueden variar según el sistema.

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;
}

Producción:

Old limits -> soft limit= 1048576      hard limit= 1048576
New limits -> soft limit= 3 hard limit= 1024
Too many open files

Hay otra llamada al sistema.
prlimit()
que combina ambas llamadas al sistema.
Para más detalles, consulte el manual escribiendo

man 2 prlimit

Publicación traducida automáticamente

Artículo escrito por Siddharth Nayak y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *