【问题标题】:How to do the equivalent of "ulimit -n 400" from within C?如何在 C 中执行相当于“ulimit -n 400”的操作?
【发布时间】:2011-05-03 20:58:53
【问题描述】:

在我开始用 C 编写的程序之前,我必须运行命令“ulimit -n 400”来提高允许打开的文件数,但是有没有办法在 C 程序中做同样的事情?

也就是说,增加该进程允许打开的文件描述符的数量。 (我对每个线程的限制不感兴趣。)

是否会涉及设置 ulimits,然后派生一个允许打开更多文件的孩子?

当然,我可以编写一个运行 ulimit 的 shell 包装器,然后启动我的 C 程序,但感觉不太优雅。我还可以通过 bash 或 sh 的源代码 grep 看看它是如何在那里完成的 - 如果我在这里没有得到答案,也许我会这样做。

同样相关,如果你想在很多文件描述符上进行选择,look here

【问题讨论】:

  • 恐怕你可以降低限制,但不能从同一个过程中提高它。
  • @Pascal,我想可能是这样,但必须有办法抚养孩子,否则 ulimit 命令将不起作用。
  • 你不能在 C 程序中调用 shell 吗?
  • @Raveline,不是真的。当您在 sh 或 bash 中运行“ulimit”时,它并没有真正运行新命令。它会更改允许其子级打开的文件数量。 (检查“which ulimit”,它不存在。)运行ulimit不会有任何改变,当被调用的shell退出C程序时,所有ulimit的变化都会立即消失。不,它必须是在第一个进程本身中完成的。
  • 您可以将自己的限制从软限制提高到硬限制。

标签: c linux unix glibc libc


【解决方案1】:

我认为您正在寻找setrlimit(2)

【讨论】:

【解决方案2】:
#include <sys/resource.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

int main (int argc, char *argv[])
{
  struct rlimit limit;
  
  limit.rlim_cur = 65535;
  limit.rlim_max = 65535;
  if (setrlimit(RLIMIT_NOFILE, &limit) != 0) {
    printf("setrlimit() failed with errno=%d\n", errno);
    return 1;
  }

  /* Get max number of files. */
  if (getrlimit(RLIMIT_NOFILE, &limit) != 0) {
    printf("getrlimit() failed with errno=%d\n", errno);
    return 1;
  }

  printf("The soft limit is %lu\n", limit.rlim_cur);
  printf("The hard limit is %lu\n", limit.rlim_max);

  /* Also children will be affected: */
  system("bash -c 'ulimit -a'");

  return 0;
}

【讨论】:

  • 用一个简单的例子和​​正确的定义 (RLIMIT_NOFILE) 添加我自己的答案以设置打开文件的数量。
  • 很好,但根据 Clang 应该是 %lu,而不是 %llu。好吧,后者也给了我错误的数字(你在 x86_64 上吗?)。像往常一样,GCC 只是忽略了这个错误。
猜你喜欢
  • 2010-10-18
  • 1970-01-01
  • 2015-01-19
  • 2013-01-07
  • 1970-01-01
  • 2016-02-14
  • 2010-09-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多