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