2013-03-21 18 views
5

Ho un descrittore di file impostato su un valore positivo con il risultato di una funzione open() in modo che questo file indichi un file. Quando cancello il file attuale, fd è ancora un numero intero positivo. Voglio sapere che se cancello un file per qualche motivo, come posso sapere che questo descrittore di file non è più valido. In breve, come posso sapere che il file che fd sta indicando, ancora lì o meno. Sto cercando di farlo in C su FreeBSD.Come verificare se un file esiste ancora utilizzando un descrittore di file

+0

Provare a scrivere o leggere sul file. Questo dovrebbe restituire un errore. – RedX

+2

@RedX non è così che funziona UNIX. – LtWorf

+0

Sì, so che devo leggere o aprire quel file ma c'è un modo per aprire o leggere un file con solo fd? c'è una funzione io per la lettura o l'apertura con solo fd, nessun percorso o FILE * –

risposta

4

I sistemi Unix consentono di eliminare i file aperti (o meglio, eliminare tutti i riferimenti al file dal filesystem). Ma il descrittore di file è ancora valido. Qualsiasi chiamata in lettura e scrittura avrà successo, come farebbe con il nome del file ancora lì.

In altre parole, non è possibile eliminare completamente un file finché il descrittore di file non viene chiuso. Una volta chiuso, il file verrà rimosso automaticamente.

Con un descrittore di file valido, è possibile controllare se il nome del file esiste ancora, ad es.

printf("%d\n", buf.st_nlink); // 0 means no filenames 

Dove buf è un struct stat inizializzato con fstat.

+0

Grazie per il consiglio, ma questa è una situazione diversa che sto affrontando. Ho solo bisogno di controllare se il file che fd indica ancora lì o no. Se no, qual è il modo di imparare che via fd? –

+1

@HasanBozok - È possibile utilizzare 'fstat' sul descrittore di file valido per ottenere il numero di collegamenti reali. Se è 0, i nomi dei file sono stati cancellati. – teppic

+0

@teppic, Esiste un modo ['ioctl'] (http://pubs.opengroup.org/onlinepubs/009696699/functions/ioctl.html) per poter effettivamente cancellare il file? Se fosse possibile, sarebbe pericoloso? –

1

Prima di scrivere il file che si potrebbe verificare se è ancora lì utilizza access()

if (access("/yourfile",W_OK)!=-1) { 
    //Write on the file 
} 

È anche possibile fare fstat sul descrittore:

struct stat statbuf; 
fstat(fd,&statbuf); 
if (statbuf.st_nlink > 0) { 
    //File still exists 
} 

ma sarà rallentare il software giù un molto, e anche qualche programma potrebbe collegare il file da qualche altra parte e scollegare il nome originale, in modo che il file sarebbe ancora esistente ma con un nome/percorso diverso, e questo metodo non lo rileverebbe.

un'alternativa migliore sarebbe quella di utilizzare inotify su GNU/Linux, o kqueue su BSD, ma non ho mai usato il 2 °.

è possibile utilizzare queste API per guardare i cambiamenti in directory e ricevere notifiche dal kernel e ottenere un evento quando il tuo file sia cancellato con altro processo, e fare qualcosa al riguardo.

Ricorda che questi eventi non sono in tempo reale, quindi puoi ancora utilizzare il file per un paio di millisecondi prima di ottenere l'evento.

Problemi correlati