操作系统控制打开的文件描述符的最大数目。
是否有一种方法,只有一个进程设置了一个特定的最大开放文件数,而其他进程只能使用传统的默认最大开放文件数?
可以。
进程可以使用getrlimit
和setrlimit
来限制它可以打开的文件数量。
对当前进程进行操作。
一个程序可以使用fork
,使用getrlimit/setrlimit
,然后执行(例如)execvp
来限制子程序。
下面是一些代码。由于stdin/stdout/stderr
是打开的,因此报告的计数将减少3。
#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: %dn",count);
return 0;
}
正常输出:rlim_cur=1024 rlim_max=4096 [original]
open: Too many open files
max open files: 1021
参数为17的输出:
rlim_cur=1024 rlim_max=4096 [original]
rlim_cur=17 rlim_max=4096 [setrlimit]
open: Too many open files
max open files: 14
使用prelimit更改特定进程的资源限制的一种方法,
prelimit——pid<PID>
——nofile=1024:4095
内部prelimit使用系统调用setrlimit()来设置限制。