我可以将文件描述符限制设置为每线程限制吗?

标签 c linux multithreading pthreads

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

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

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

我期望 pthread_attr_t 中的一些属性可以适用于子线程,以具有单独的文件表。

最佳答案

在 Linux 上,

unshare(CLONE_FILES);

(如果成功)将为当前线程提供自己的文件描述符表。

它应该可以从一个已经产生的内核支持(我知道的所有 Linux pthreads 实现)pthread 中使用。

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

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

关于我可以将文件描述符限制设置为每线程限制吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57473781/

相关文章:

python - 如何在某些C代码执行某个线程时保持python脚本打开?

java - 线程的简单问题

c - 我的 C 程序如何知道在哪里可以找到我的二进制库?

c - printf 格式字符串最大宽度值(填充)%(??)d%n

linux - 显示 Docker 基础镜像中包含哪些内核功能的任何命令?

c++ - librt和对`mq_unlink'和 friend 的 undefined reference

multithreading - 异步任务超时?

c - 如何写入C目录

c - 未初始化和空指针之间的区别

linux - 如何使用 DMA 在一个线程中同时写入不同磁盘上的多个文件?