我正在 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/