Quando você usa open()
para abrir um arquivo (consulte man 2 open
), você obtém um descritor de arquivo para ele (é um int
em C). Os fluxos padrão estão associados aos descritores 0, 1 e 2, e qualquer outro fluxo de arquivo aberto terá um descritor separado associado a ele.
Há um limite de quantos arquivos você pode abrir de uma só vez, geralmente em torno de 512 ou 1024 (veja ulimit -Hn
para o limite superior rígido), e cada um desses arquivos abertos terá um descritor de arquivo associado a eles.
Conceitualmente, é apenas um índice em uma matriz mantida pelo kernel. Além dos três padrões, não há associação fixa entre os descritores de arquivos e qualquer outro fluxo.
No log que você adicionou à pergunta, você vê que os "descritores de arquivos negativos" estão associados a códigos de erro ( ENOENT
e EACCESS
). A chamada do sistema open()
retorna números negativos para erros.
Veja man errno
para obter uma descrição desses códigos de erro.
Os descritores de arquivo são por processo, portanto, o descritor de arquivo 6 no processo A não é o mesmo fluxo que o descritor de arquivo 6 no processo B.