查看本机一个进程能打开的最大文件描述符: ulimit -n//[0,1023)
修改个数:
sudo ulimit -n x//x为要修改成为的描述符个数
如果要通过程序来修改,则要用到getrlimit(.....);
其中 rlimit结构体如下所示
//soft limit是指内核所能支持的资源上限。比如对于RLIMIT_NOFILE(一个进程能打开的最大文件数,内核默认是1024),
soft limit最大也只能达到1024。对于RLIMIT_CORE(core文件的大小,内核不做限制),soft limit最大能是unlimited。
-
struct rlimit {
-
rlim_t rlim_cur; //soft limit
-
rlim_t rlim_max; //hard limit
-
};
一下为修改的代码,因为我的头文件是根据平常用的自动生成的,所以有一些是不必要的
#include <iostream>
#include<pthread.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<netinet/in.h>
#include<string.h>
#include<string>
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include <sys/time.h>
#include <sys/resource.h>
using namespace std;
#define ERR_EXIT(m)\
do\
{\
perror(m);\
exit(EXIT_FAILURE);\
}while(0)
int main()
{
struct rlimit rl;
if(getrlimit(RLIMIT_NOFILE,&rl)<0)
{
ERR_EXIT("getlimit");
}
rl.rlim_cur=2048;
rl.rlim_max=2048;
if(setrlimit(RLIMIT_NOFILE,&rl)<0)
ERR_EXIT("RL");
cout<<rl.rlim_max<<endl;
cout<<rl.rlim_cur<<endl;
}
但是这个程序只能更改当前进程的个数,如果我们在终端输入 ulimit -n,他还是1024
FD_SETSIZE的最大值是1024,它是一个宏定义,如果我们要修改它,还得重新编译内核