2015-06-15 25 views
20

Chciałbym sprowokować sytuację, w której nie ma już deskryptora pliku.Jak mogę zasymulować brak deskryptora pliku?

myślałem o 2 możliwości:

  1. Otwarcie tysięcy plików losowo do wyniku jest otwarta -1
  2. została ustawiona bardzo niską liczbę deskryptora pliku dostępnego (powiedzmy stdin, stdout i stderr).

Jak zrobiłbyś to?

Odpowiedz

31

Możesz ograniczyć liczbę deskryptorów plików, które proces może otworzyć pod Linuksem za pomocą ulimit.

Wykonywanie ulimit -n 3 przed uruchomieniem programu C powinno spowodować błąd podczas otwierania kolejnych plików, ponieważ stdin, stdout i stderr zajmują pierwsze 3 deskryptory.

Przykład:

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

Proces powłoka sama próbuje otworzyć/dev/null przekierować stdout przed zamknięciem go tam, więc robi błąd. Twój program C będzie podawał dokładnie ten sam błąd przy pierwszym wywołaniu fopen, open,, itp. (Lub cokolwiek, co przydzieli nowy deskryptor pliku).

+8

Lub użyj ['setrlimit'] (http://linux.die.net/man/2/setrlimit) z C. – o11c

+0

Czy powłoka tworzy deskryptory plików podczas tworzenia zewnętrznego programu? Myślę, że potok musiałby przynajmniej użyć 'pipe (2)' i różne rodzaje podstawiania również mogą powodować problemy. Przynajmniej powinieneś wiedzieć, że ulimit znacznie utrudni twoją powłokę. – Kevin

+0

@Kevin, przekierowanie może być wykonane przez 'dup (2)', 'dup2 (2)' lub 'pipe (2)', ale gdy powłoka po prostu spawnuje program i tylko widelce i używa 'execve (2)' która przechodzi przez pierwsze 3 deskryptory bez tworzenia nowych podprocesów. Dla rzeczywistego przekierowania, niezależnie od tego, czego używasz, tworzony jest deskryptor, ponieważ deskryptor jest duplikowany, zanim można go ponownie przypisać/dołączyć, ponieważ stdin jest już powiązany z deskryptorem stdin powłoki. Limit może zostać podniesiony ponownie dopiero po teście do domyślnego górnego limitu (zobacz wartość domyślną z 'ulimit -n'). – Matthew

Powiązane problemy