我可以将文件描述符限制设置为 per-thread 限制吗?

Can I make the file descriptor limit a per-thread limit?

我正在 Centos-6 x86_64 机器上工作。默认情况下,如果我启动一个进程,它可以打开 1024 个文件(包括标准 in/out/error 流)并且我可以使用 setrlimit() API 扩展该限制。

我的问题是,如果我在进程中启动一个线程,它会共享此限制。例如,假设我是 运行 一个打开 1024 个描述符的 parent 进程,然后如果我使用 pthread_create() 创建一个线程,它无法打开单个文件,因为它 parent 已经打开了 1024 个描述符并消耗了全部限制。

我想让 child 线程(不是 child 进程)能够像其 parent 一样打开 1024 个文件。我知道将 parent 的文件描述符限制扩展到 2048 将允许 child 打开 1024 个以上的文件。但我想让 parent 和 child 有单独的限制,而不是共享限制。

我希望 pthread_attr_t 中的某些属性适用于 child 线程以具有单独的文件 table。

在 Linux、

unshare(CLONE_FILES);

(如果成功)会给当前线程自己的文件描述符 table.

它应该可以从已经生成的 kernel-backed(我知道的所有 Linux pthreads 实现)pthread 中使用。

似乎甚至没有一个 nonportable pthread 属性可供您设置,但您可以使用上述方法包装 pthread_create,添加此功能。

如果您在 Linux 上执行自己的线程,则可以将 CLONE_FILES 标志直接传递给 clone。否则你需要让你的 wrapped_pthread_create 等到 child 进行了 unshare 调用(如果调用失败则取消并获取线程)。