2015-06-15 10 views
20

Vorrei provocare una situazione in cui non è disponibile alcun descrittore di file.Come posso simulare una mancanza di descrittore di file?

ho pensato a 2 possibilità:

  1. Apertura di migliaia di file in maniera casuale fino a quando il risultato di OPEN è -1
  2. Impostare un numero molto basso di descrittore di file disponibili (diciamo stdin, stdout e stderr).

Come lo fareste?

risposta

31

È possibile limitare il numero di descrittori di file che un processo può aprire sotto Linux utilizzando ulimit.

L'esecuzione di ulimit -n 3 prima di eseguire il programma C dovrebbe rendere un errore aprire altri file, dal momento che stdin, stdout e stderr occupano i primi 3 descrittori.

Un esempio:

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

Il processo shell stessa tenta di aprire/dev/null reindirizzare stdout prima di chiuderlo lì, quindi ottiene un errore. Il tuo programma C riceverà lo stesso identico errore la prima volta che chiama fopen, aperto, socket, ecc. (O qualsiasi cosa che assegna un nuovo descrittore di file).

+8

Oppure utilizzare [ 'setrlimit'] (http://linux.die.net/man/2/setrlimit) da C. – o11c

+0

Ha il guscio creare descrittori di file quando la deposizione delle uova un programma esterno? Penso che un oleodotto avrebbe almeno bisogno di usare 'pipe (2)' e vari tipi di sostituzione potrebbero anche causare problemi. Per lo meno, dovresti essere consapevole che questo ulimit ostacolerà notevolmente il tuo guscio. – Kevin

+0

@Kevin, il reindirizzamento può essere fatto tramite 'dup (2)', 'dup2 (2)', o 'pipe (2)', ma quando la shell genera semplicemente un programma e si limita a forche e usa 'execve (2)' che passa sopra i primi 3 descrittori senza crearne di nuovi nel sottoprocesso. Per il reindirizzamento effettivo, indipendentemente da ciò che si usa, viene creato un descrittore, dal momento che il descrittore è duplicato prima di poter essere riassegnato/collegato, poiché stdin è già associato al descrittore di stdin della shell. Il limite può essere aumentato nuovamente dopo il test fino al limite superiore predefinito (vedere il valore predefinito con 'ulimit -n'). – Matthew

Problemi correlati