setrlimit 不适用于 OS X Maverick 和 Yosemite

setrlimit doesn't work on OS X Maverick and Yosemite

我在公司工作,为各种程序编写音频插件,目前我在 Os X Mavericks 和 Yosemite 上遇到以下逻辑问题。 Logic 会扫描我们所有的插件,并且在某些时候它无法再访问这些文件。 errno 是 24,意思是 "Too Many Open Files"

我们的代码中有以下行,增加了可用的文件描述符:

struct rlimit limit;
if (::getrlimit(RLIMIT_NOFILE, &limit) == 0)
{
    limit.rlim_cur = (in_maxOpenFiles);
    setrlimit(RLIMIT_NOFILE, &SetLimit);
}

我也试过:

struct rlimit limit;
if (::getrlimit(RLIMIT_NOFILE, &limit) == 0)
{
    limit.rlim_cur = (in_maxOpenFiles);
    limit.rlim_max = (in_maxOpenFiles);
    setrlimit(RLIMIT_NOFILE, &SetLimit);
}

然而这并没有帮助。 有趣的是,如果我打开终端,然后 运行 以下命令:

ulimit -n 1024

然后我 运行 终端内的逻辑一切正常,没有描述符问题!!

现在,我认为 setrlimit 应该和 setrlimit 一样,不是吗? 我做错了什么?

P.S。我也试过这个解决方案: https://unix.stackexchange.com/questions/108174/how-to-persist-ulimit-settings-in-osx-mavericks

没有帮助。

我最终在这篇文章中找到了解决我的问题的方法: http://docs.basho.com/riak/latest/ops/tuning/open-files-limit/#Mac-OS-X

这也是解决方案(对于 Maverick,不是 Yosemite): https://unix.stackexchange.com/questions/108174/how-to-persist-ulimit-settings-in-osx-mavericks

但是,setrlimit为什么会失败,目前还不清楚。可能 OS X 错误(或功能)。

如果没有第 3 方软件搞乱 w/ulimit、launchctl 限制最大文件等,上面的代码(第一个变体)不会失败。重新启动您的 mac 并重试。

P.S。让我们不要乘以这样的软件 P.P.S 检查 'errno' 变量的错误代码