2015-06-15 5 views
20

Я хотел бы спровоцировать ситуацию, когда нет дескриптора файла.Как я могу имитировать отсутствие дескриптора файла?

Я думал о 2 возможности:

  1. не Открытие тысячи файлов в случайном порядке, пока результат ОТКРЫТО -1
  2. Установите очень низкое количество дескриптора файла, доступный (скажем, STDIN, STDOUT и STDERR).

Как вы это сделаете?

ответ

31

Вы можете ограничить количество дескрипторов файлов, которые процесс может открыть в Linux с помощью ulimit.

Выполнение ulimit -n 3 перед запуском вашей программы на C должно сделать ошибку, чтобы открыть больше файлов, поскольку stdin, stdout и stderr занимают первые 3 дескриптора.

Пример:

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

Процесс оболочки сам пытается открыть/DEV/нуль, чтобы перенаправить стандартный вывод перед закрытием его там, поэтому он получает сообщение об ошибке. Ваша программа C будет подаваться с той же самой ошибкой при первом вызове fopen, open, socket и т. Д. (Или все, что выделяет новый файловый дескриптор).

+8

Или использовать ['setrlimit'] (http://linux.die.net/man/2/setrlimit) из C. – o11c

+0

Создает ли оболочка файловые дескрипторы при нерестах внешней программы? Я думаю, что трубопровод, по крайней мере, должен будет использовать 'pipe (2)', и различные виды замещения могут также вызвать проблемы. По крайней мере, вы должны знать, что этот ulimit сильно помешает вашей оболочке. – Kevin

+0

@Kevin, перенаправление может быть выполнено с помощью 'dup (2)', 'dup2 (2)' или 'pipe (2)', но когда оболочка просто запускает программу и просто вилки и использует 'execve (2)' который проходит через первые 3 дескриптора без создания новых подпроцессов. Для фактического перенаправления, независимо от того, что вы используете, создается дескриптор, поскольку дескриптор дублируется до его переназначения/присоединения, поскольку stdin уже привязан к дескриптору stdin оболочки. Предел может быть снова поднят после теста до верхнего предела по умолчанию (см. Значение по умолчанию с 'ulimit -n'). – Matthew

Смежные вопросы