举个例子:
打开的文件数限制:resource = RLIMIT_NOFILE
1.打印其软限制值 硬限制值
struct rlimit lim;
getrlimit(RLIMIT_NOFILE, &lim);
printf("软限制-> %ld, 硬限制-> %ld\n", lim.rlim_cur, lim.rlim_max);
2.打开文件,通过open,一直打开 直到限制值那么多个文件
·先用硬限制
for (int i = 0; i < lim.rlim_max; ++i) {
snprintf(filename, sizeof(filename), "%d_%ld", getpid(), i);
fd = open(filename, O_RDWR| O_CREAT | O_TRUNC, 0664);
if(fd < 0) {
fprintf(stderr, "open file %s failed\n", filename);
exit(1);
} else {
printf("open file %s success\n", filename);
}
}
3.输出:软限制1024,硬限制4096
发现:
1> i 明明是小于硬限制,但文件却只读取了1021个。。
2> 1021这个值如果是软限制的话,那为啥不是1024?
解答:1> 因为 软限制 才是 实际的 限制值;
比如你想吃汉堡,你的肚子最多只能吃2个,但是商店最多却可以卖你5个;
那肚子的含堡量看作是资源,软限制 = 2,硬限制 = 5;
你明明被允许吃5个,但却只能吃2个。
但如果你被赋予了大胃王神力,即软限制 = 硬限制 了,也就是你的肚子可以容纳5个了,那此时软限制 = 5 硬限制 = 5, 代码示例:
lim.rlim_cur = lim.rlim_max;
for (int i = 0; i < rlim_max; ++i) { //此时 软限制(实际的限制值) 已是4096
...
}
输出:
综上,肚子容纳多少汉堡 取决于 肚子(软限制),就算是调用硬限制 那备用的值的大小 还是和软限制一样。
3> 每个进程启动的时候,会默认打开 stdin, stdout, stderr 3个文件