Pergunta

Quando eu criar um socket utilizando accept () e fazer um arquivo de fora usando fdopen (), o que eu tenho que fazer para limpar tudo em cima? Preciso fazer fclose () no arquivo, shutdown () e close () no soquete, ou apenas o shutdown () e ou close () ou fclose ()? Se eu não fizer fclose (), eu tenho que libertar () O ponteiro do arquivo manualmente?

Foi útil?

Solução

De homem fdopen:

O descritor de arquivo não é dup'ed, e será fechado quando o fluxo criado por fdopen () está fechado

Então, eu iria usar apenas fclose (), que também fecha o descritor de arquivo subjacente. Eu não sei se é necessária shutdown (), qualquer um.

Outras dicas

A partir http://opengroup.org/onlinepubs/007908775/xsh/fclose. html

A função fclose () irá realizar um close () no descritor de arquivo que é associada com o fluxo apontado por stream.

Se você já envolto sua tomada em um córrego que provavelmente não faz mais sentido para shutdown (), pelo menos não sem liberar o fluxo de primeira. Mas eu não vou jurar, porque eu não sei que não há utilizações onde você gostaria de shutdown () ao invés de apenas close ().

Você tem 2 coisas aqui que você precisa para limpar: o fluxo representado por FILE eo descritor de arquivo representado pelo socket. Você precisa fechar o fluxo de primeira, então o descritor de arquivo. Assim, em geral, você vai precisar para fclose() quaisquer objetos FILE, então close() quaisquer descritores de arquivos.

Pessoalmente eu nunca usei shutdown() quando quero limpeza depois de mim, então eu não posso dizer.

editar

Outros corretamente apontou que fdclose() irá também perto o descritor de arquivo subjacente, e desde chamando close() em um descritor de arquivo próximo levará a um erro, neste caso você só precisa fdclose().

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