在 Mac 或 Linux 上,如果您使用该命令,ulimit -n
您可以根据以下命令查看似乎是单个进程的页面打开限制这个 stackoverflow 帖子。
因此,如果父进程生成子进程并且这些子进程打开文件,那么这些文件是否会计入父进程的打开文件限制?
答案1
RLIMIT_NOFILE 是关于您可以获取/分配的最大文件描述符值,而不是一次可以打开多少个文件。
子进程继承该限制,但除此之外,子进程不能做任何事情来影响父进程。如果父级在 0->limit-1 范围内有一些空闲 fd,那么无论其子级做什么,它仍然能够打开新文件(符合该限制)(尽管您可能会遇到其他全局限制) )。
无论如何,请注意,如果限制为 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
该进程运行的ls
限制为 500,这是从其父进程继承的(因此无法获取新的fd 大于 499)。但 fd 1023 仍然处于打开状态。