2011-09-04 3 views

risposta

12

Questa è una domanda complicata. Tuttavia, lo standard POSIX non coprirlo nella descrizione di close():

Se la chiusura() è interrotta da un segnale che deve essere catturato, esso restituisce -1 con errno impostato su [EINTR] e lo stato di fildes non è specificato. Se si verifica un errore I/O durante la lettura o la scrittura sul file system durante close(), può restituire -1 con errno impostato su [EIO]; se viene restituito questo errore, lo stato dei fildes non è specificato.

Quindi, lo stato del descrittore di file non è specificato dallo standard.

Per scopi pratici, è chiuso; c'è ben poco che puoi fare con il descrittore di file anche se è ufficialmente aperto. È possibile provare un'operazione innocua (come fcntl() e F_GETFL) e vedere se si ottiene indietro EBADF, che indica che il descrittore è formalmente chiuso. Ma se è aperto e la causa dell'errore EIO è permanente, è probabile che tu riceva l'EIO ogni volta che provi a fare qualcosa (ad esempio includendo la chiamata fcntl()). Si potrebbe o non si potrebbe mai ottenere lo stesso descrittore restituito da un'altra operazione simile a quella aperta. Non è chiaro che anche dup2() potrebbe riuscire a specificare il descrittore di file "morto" come destinazione se il descrittore di file morto è aperto ma non è possibile chiuderlo.

+8

Se il programma è multithread o utilizza gestori di segnale, testare il descrittore di file usando 'fcntl() potrebbe non essere così semplice, poiché potrebbe essere stato chiuso e quindi riutilizzato per qualcos'altro. – mark4o

+0

Si tratta di un problema se si utilizza un framework non standard come libuv? – Breton

+0

Sì, questo è un problema in qualsiasi framework costruito usando 'open()', 'close()' e parentali, quindi a meno che 'libuv' non usi un insieme diverso di chiamate di sistema di' open() 'e' close() ' (che è piuttosto improbabile), potrebbe risentire di problemi con il fallimento di 'close()' e l'eliminazione del descrittore di file in uno stato indeterminato. –

Problemi correlati