Chiusura / pulizia & # 8220; misto & # 8221; descrittori di file / socket
-
01-07-2019 - |
Domanda
Quando creo un socket usando accept () e ne ricavo un FILE usando fdopen (), cosa devo fare per ripulire tutto? Devo eseguire fclose () sul FILE, shutdown () e close () sul socket, oppure solo shutdown () eo close () o fclose ()? Se non eseguo fclose (), devo liberare manualmente () il puntatore FILE?
Soluzione
Da man fdopen:
Il descrittore di file non è dup & # 8217; ed e verrà chiuso alla chiusura dello stream creato da fdopen ()
Quindi userei solo fclose (), che chiude anche il descrittore di file sottostante. Non so nemmeno se sia necessario shutdown ().
Altri suggerimenti
Da http://opengroup.org/onlinepubs/007908775/xsh/fclose. html
La funzione fclose () eseguirà a close () sul descrittore di file che è associato al flusso indicato in streaming.
Se hai racchiuso il tuo socket in uno stream, probabilmente non ha più senso chiudere (), almeno non prima di svuotare lo stream. Ma non lo giuro, perché non so che non ci sono usi in cui vorresti chiudere () piuttosto che chiudere ().
Qui hai 2 cose che devi ripulire: il flusso rappresentato da FILE
e il descrittore di file rappresentato dal socket. Devi prima chiudere lo stream, quindi il descrittore di file. Quindi, in generale dovrai fclose ()
qualsiasi oggetto FILE
, quindi close ()
qualsiasi descrittore di file.
Personalmente non ho mai usato shutdown ()
quando voglio ripulire dopo me stesso, quindi non posso dirlo.
modifica
Altri hanno giustamente sottolineato che fdclose ()
chiuderà anche il descrittore di file sottostante e poiché la chiamata di close ()
su un descrittore di file chiuso porterà a un errore , in questo caso hai solo bisogno di fdclose ()
.