Atribuição de descritor de arquivo em C
-
09-06-2019 - |
Pergunta
Quando soquetes são criados ou arquivos são abertos/criados em C, o descritor de arquivo atribuído ao soquete/arquivo é garantido como o descritor de menor valor disponível?O que a especificação C diz sobre a atribuição do descritor de arquivo a esse respeito, se houver alguma coisa?
Solução
Não é garantido que seja o mais baixo e depende da implementação (1).Em geral, porém, a rotina que atribui descritores de arquivos abertos usa um método que fornece a primeira abertura.Pode ser que imediatamente após vários valores inferiores sejam liberados, deixando você com um descritor mais alto do que você poderia esperar.
A única razão pela qual consigo saber disso é a função select, que é acelerada se você passar o descritor de arquivo mais alto que precisa verificar.
(1) Observe que as implementações que seguem o padrão IEEE garantem o menor descritor não utilizado para arquivos, mas isso pode não se aplicar a soquetes.Nem toda implementação segue o padrão IEEE para open(), portanto, se você estiver escrevendo software portátil, é melhor não depender dele.
Outras dicas
Não acho que você o encontrará na especificação C, mais provavelmente na especificação do seu sistema operacional.Minha experiência no Linux tem sido sempre a mais baixa.
Vou responder a isso com outra pergunta: por que isso importa?Você não deve comparar o descritor de arquivo com nada (a menos que verifique stdin/stdout/stderr) ou fazer contas com ele.Contanto que caiba em um int (e é garantido), isso é tudo que você realmente precisa saber.
Steve M está certo;C não tem noção de soquetes e suas funções de E/S de arquivo usam um [ponteiro para um] objeto FILE, não um descritor.
@aib open(), close(), lseek(), read(), write() fazem uso de descritores de arquivo.Quase nunca uso streams para E/S.
@Kyle, isso é importante por causa de declarações como select().Conhecer o descritor mais alto pode melhorar o desempenho.
A especificação C diz que depende da implementação.Se você estiver olhando para uma implementação Unix, a página man do open(2) diz "O descritor de arquivo retornado por uma chamada bem-sucedida será o descritor de arquivo de número mais baixo não aberto no momento para o processo."
Isso ajuda se você estiver tentando anexar um arquivo específico a um descritor específico.Digamos que você queira redirecionar stderr para/dev/null.Algo como
fechar(2);open("/dev/null", O_WRONLY);
deveria fazer isso.Você deve, é claro, capturar o fd retornado por open e garantir que seja 2.