a stdin, stdout e stderr sono associati i descrittori rispettivamente 0, 1 e 2 e non si devono aprire esplicitamente, ci pensa il sistema.
Quando apri un file il sistema ti ritorna un nuovo descrittore che è necessariamente maggiore di 2 (in quanto i primi tre sono già impegnati) o minore di 0 se c'è un errore (per esempio non ci sono più descrittori disponibili o il file non esiste o non è accessibile alla lettura ecc.)
Quindi quello che dici è molto strano.
Se riesci prova a circoscrivere la cosa in un programmino compilabile e postalo.
ciao
sergio