为什么fork()后系统中的文件描述符总数没有增加?

为什么fork()后系统中的文件描述符总数没有增加?

我首先在程序中创建了很多文件描述符,并且我看到系统文件描述符的数量在增加:

# bash(1) before:
cat /proc/sys/fs/file-nr
1024    0   97861
# bash (2): create a lot of fds
>>> a = []
>>> while True:
...   a.append(open('asdf', 'a'))
... 
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
IOError: [Errno 24] Too many open files: 'asdf'
>>> 

正如预期的那样,文件描述符的数量增加了:

# back to bash (1) output
cat /proc/sys/fs/file-nr
2048    0   97861

现在,如果我在 python 中 fork() ,我希望内核也将所有这些 fd 复制到子级中 - 但这似乎并没有增加file-nr?中的数量。

# bash (2): more commands at python- fork a child
>>> import os
>>> import time
>>> if os.fork() == 0:
...   time.sleep(1000)
... else:
...   time.sleep(1000)
... 

答案1

file-nr显示打开数量文件,从内核的角度来看(这对应于打开文件描述,它们是内核数据结构,而不是文件描述符,这是每个进程)。分叉不会打开任何新文件,因此文件数量file-nr不会增加。

相关内容