如何模拟文件描述符不足?

22
我希望引发一种没有文件描述符剩余的情况。
我一直在考虑两种可能性:
1.随机打开数千个文件,直到open的结果为-1。
2.设置非常低的可用文件描述符数量(比如标准输入、标准输出和标准错误)。
你会怎么做?
1个回答

32

您可以使用 ulimit 在 Linux 下限制进程可以打开的文件描述符数量。

在运行 C 程序之前执行 ulimit -n 3 应该会使任何进一步打开的文件都出现错误,因为 stdin、stdout 和 stderr 占用了前 3 个描述符。

一个示例:

$ ulimit -n 3
$ echo > /dev/null
zsh: too many open files: /dev/null

在关闭stdout之前,shell进程本身尝试打开/dev/null以重定向stdout,因此它会收到一个错误。您的C程序在第一次调用fopen、open、socket等(或任何分配新文件描述符的操作)时将接收到完全相同的错误。


当启动外部程序时,shell是否会创建文件描述符?我认为管道至少需要使用pipe(2),各种替换也可能会导致问题。最起码,您应该意识到这个ulimit将极大地妨碍您的shell。 - Kevin
@Kevin,重定向可以通过dup(2)dup2(2)pipe(2)来完成,但当Shell仅仅生成一个程序并且只分叉和使用execve(2)时,它会将前3个描述符传递给子进程而不创建新的。对于实际的重定向,无论你使用什么,都会创建一个描述符,因为在重新分配/附加之前,该描述符会被复制,而stdin已经绑定到Shell的stdin描述符上。测试后,这个限制可以再次提高到默认的上限(请使用ulimit -n查看默认值)。 - Matthew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接