Sul mio sistema (Ubuntu Linux, glibc), la pagina man di una chiamata close
specifica diversi valori di ritorno di errore che può restituire. Dice ancheCosa fare se una chiamata di chiusura posix fallisce?
La mancata verifica del valore restituito di close() è un errore di programmazione comune ma comunque grave.
e allo stesso tempo
Si noti che il valore di ritorno deve essere utilizzato solo per la diagnostica. In particolare, close() non dovrebbe essere ripetuto dopo un EINTR poiché ciò potrebbe causare la chiusura di un descrittore riutilizzato da un altro thread.
Quindi non mi è consentito ignorare il valore restituito né riprovare la chiamata.
Dato che, come devo gestire l'errore di chiamata close()
?
Se l'errore si è verificato durante la scrittura di qualcosa nel file, probabilmente dovrei provare a scrivere le informazioni da qualche altra parte per evitare la perdita di dati.
Se stavo solo leggendo il file, posso solo registrare l'errore e continuare il programma facendo finta che non sia successo niente? Ci sono avvertimenti, perdite di descrittori di file o quant'altro?
pensato a questo. (http://unix.stackexchange.com/questions/231677/failing-close-system-call) I fallimenti ravvicinati hanno senso in alcuni casi (ad esempio, errori di sincronizzazione del disco), ma penso che dovrebbe essere sicuro assumere non fallire in alcuni altri casi. Come chiudere un'istanza di un filedescriptor duplicato che non è l'ultima istanza che punta allo stesso file fisico o che chiude una pipe, perché sarebbero fondamentalmente bug del kernel, ma mi piacerebbe ricevere una risposta più illuminata. – PSkocik
FWIW, Raymond Chen interpreta questo tipo di situazione generale: http://blogs.msdn.com/b/oldnewthing/archive/2008/01/07/7011066.aspx –
Qualunque cosa tu faccia, * fa sempre sapere all'utente * . Basta "loggarlo" in qualche file di log interno che nessuno guarda mai non è abbastanza; vorrai che l'utente sappia che sta succedendo qualcosa di strano. Per le applicazioni GUI, vorrei aprire una finestra di dialogo modale. Per le applicazioni della riga di comando, stamperei un avvertimento sull'errore standard. Per i servizi, il file di registro è sufficiente. Se l'errore 'close()' si verifica dopo aver scritto su un file, interrompo esattamente nello stesso modo in cui verrei se avessi riscontrato un errore di scrittura durante la scrittura sul file. –