Pregunta

Cuando creo un socket usando aceptar() y hago un ARCHIVO usando fdopen(), ¿qué tengo que hacer para limpiar todo?¿Necesito hacer fclose() en el ARCHIVO, apagar() y cerrar() en el socket, o solo apagar() y/o cerrar() o fclose()?Si no hago fclose(), ¿tengo que liberar() el puntero ARCHIVO manualmente?

¿Fue útil?

Solución

Del hombre fdopen:

El descriptor de archivo no está duplicado y se cerrará cuando se cierre la secuencia creada por fdopen().

Entonces simplemente usaría fclose(), que también cierra el descriptor de archivo subyacente.Tampoco sé si es necesario cerrar().

Otros consejos

De http://opengroup.org/onlinepubs/007908775/xsh/fclose.html

La función fclose () realizará un cierre () en el descriptor de archivo que está asociado con la transmisión señalada por flujo.

Si ha envuelto su socket en una secuencia, probablemente ya no tenga sentido apagar(), al menos no sin vaciar la secuencia primero.Pero no lo juraré, porque no sé si no hay usos en los que quieras apagar() en lugar de simplemente cerrar().

Tienes 2 cosas aquí que necesitas limpiar:la corriente representada por FILE y el descriptor de archivo representado por el socket.Primero debe cerrar la transmisión y luego el descriptor del archivo.Entonces, en general necesitarás fclose() cualquier FILE objetos, entonces close() cualquier descriptor de archivo.

Personalmente nunca he usado shutdown() cuando quiero limpiar lo que ensucio, así que no puedo decirlo.

editar

Otros han señalado correctamente que fdclose() también cerrará el descriptor de archivo subyacente y, desde que se llama close() cerrar un descriptor de archivo generará un error; en este caso, solo necesita fdclose().

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top