子进程打开的文件是否计入父进程的文件打开限制?

ham*_*dog 3 process limit files

在 Mac 或 Linux 上,如果您使用该命令,ulimit -n您可以根据此 stackoverflow 帖子看到似乎是单个进程的页面打开限制

因此,如果父进程产生子进程并且这些子进程打开文件,那么这些文件是否计入父进程的打开文件限制?

Sté*_*las 7

RLIMIT_NOFILE 是您可以获得/分配的最大文件描述符值,而不是一次可以打开多少个文件。

子进程继承限制,但除此之外,子进程无法影响父进程。如果父级在 0->limit-1 范围内有一些空闲 fds,那么它仍然可以打开新文件(写入该限制),无论其任何子级做什么(尽管您可能会遇到其他全局限制) )。

在任何情况下,请注意,如果限制为 500,如果在降低限制之前打开了一些文件描述符(包括在父进程中),您仍然可以打开 500 个以上的文件描述符。

$ bash -c 'exec  1023> /dev/null; ulimit -n 500;
   command exec 600> /dev/null; ls -l /proc/self/fd; exit'
bash: 600: Bad file descriptor
total 0
lrwx------ 1 chazelas chazelas 64 Jun 17 08:40 0 -> /dev/pts/1
lrwx------ 1 chazelas chazelas 64 Jun 17 08:40 1 -> /dev/pts/1
l-wx------ 1 chazelas chazelas 64 Jun 17 08:40 1023 -> /dev/null
lrwx------ 1 chazelas chazelas 64 Jun 17 08:40 2 -> /dev/pts/1
l-wx------ 1 chazelas chazelas 64 Jun 17 08:40 3 -> /dev/null
lr-x------ 1 chazelas chazelas 64 Jun 17 08:40 4 -> /proc/8034/fd
Run Code Online (Sandbox Code Playgroud)

该进程运行ls的限制为 500,从其父级继承而来(因此无法获得大于 499的fd)。它仍然打开了 fd 1023。