我希望引发一种没有文件描述符剩余的情况。
我一直在考虑两种可能性:
1.随机打开数千个文件,直到open的结果为-1。
2.设置非常低的可用文件描述符数量(比如标准输入、标准输出和标准错误)。
你会怎么做?
我一直在考虑两种可能性:
1.随机打开数千个文件,直到open的结果为-1。
2.设置非常低的可用文件描述符数量(比如标准输入、标准输出和标准错误)。
你会怎么做?
您可以使用 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等(或任何分配新文件描述符的操作)时将接收到完全相同的错误。
pipe(2)
,各种替换也可能会导致问题。最起码,您应该意识到这个ulimit将极大地妨碍您的shell。 - Kevindup(2)
、dup2(2)
或pipe(2)
来完成,但当Shell仅仅生成一个程序并且只分叉和使用execve(2)
时,它会将前3个描述符传递给子进程而不创建新的。对于实际的重定向,无论你使用什么,都会创建一个描述符,因为在重新分配/附加之前,该描述符会被复制,而stdin已经绑定到Shell的stdin描述符上。测试后,这个限制可以再次提高到默认的上限(请使用ulimit -n
查看默认值)。 - Matthew