while(f > oldlimit) {
int decr_step = 16;
limit.rlim_cur = f;
limit.rlim_max = f;
if (setrlimit(RLIMIT_NOFILE,&limit) != -1) break;
setrlimit_error = errno;
/* We failed to set file limit to 'f'. Try with a
* smaller limit decrementing by a few FDs per iteration. */
if (f < decr_step) break;
f -= decr_step;
}
网上说软限制不能超出硬限制,为什么不直接把软限制改成和硬限制一样大呢,如上代码(redis源码)还尝试什么?
我猜是因为 Redis 不想检查自己有没有更改 rlim_max 的权限,所以直接尝试好了。如果直接把软限制改成和硬限制一样大,那还要判断,如果 maxfiles > rlim_max,自己能不能把 rlim_max 改大,如果不能,再设置 rlim_cur 为 rlim_max。检查和设置之间还有竞态。