Home > front end >  How to set the max number of open files in only one process?
How to set the max number of open files in only one process?

Time:12-02

OS controls the max number of open file discripters.

Is there any method that only a process sets a specific the max number of openfiles and, other processes only can use the traditional default max number of openfiles?

CodePudding user response:

Yes.

A process can use getrlimit and setrlimit to limit the number of files it may open.

It operates on the current process.

A program that uses this can do a fork, use getrlimit/setrlimit and then do (e.g.) execvp to limit a child program.


Here is some code. The count reported will be 3 less because stdin/stdout/stderr are open.

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/resource.h>

void
show(struct rlimit *rlim,const char *who)
{

    printf("rlim_cur=%d rlim_max=%d [%s]\n",
        rlim->rlim_cur,rlim->rlim_max,who);
}

int
main(int argc,char **argv)
{
    int err;
    struct rlimit rlim;

    --argc;
      argv;

    setlinebuf(stdout);
    setlinebuf(stderr);

    err = getrlimit(RLIMIT_NOFILE,&rlim);
    if (err < 0) {
        perror("getrlimit");
        exit(1);
    }

    show(&rlim,"original");

    if (argc > 0) {
        rlim.rlim_cur = atoi(*argv);
        err = setrlimit(RLIMIT_NOFILE,&rlim);

        if (err < 0) {
            perror("setrlimit");
            exit(1);
        }

        err = getrlimit(RLIMIT_NOFILE,&rlim);
        if (err < 0) {
            perror("setrlimit");
            exit(1);
        }
        show(&rlim,"setrlimit");
    }

    int count = 0;
    while (1) {
        int fd = open("/dev/null",O_RDONLY);
        if (fd < 0) {
            perror("open");
            break;
        }
          count;
    }

    printf("max open files: %d\n",count);

    return 0;
}

Normal output:

rlim_cur=1024 rlim_max=4096 [original]
open: Too many open files
max open files: 1021

Output with arg of 17:

rlim_cur=1024 rlim_max=4096 [original]
rlim_cur=17 rlim_max=4096 [setrlimit]
open: Too many open files
max open files: 14

CodePudding user response:

One way to change resource limits of a particular process using prlimit,

prlimit --pid <PID> --nofile=1024:4095

Internally prlimit makes use of system call setrlimit() to set the limits.

  • Related