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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top