2010-04-18 18 views
6

Ho un'applicazione multithread che sta aprendo e leggendo lo stesso file (non scrivendo). Sto aprendo un descrittore di file diverso per ogni thread (ma tutti puntano allo stesso file). Ogni thread legge quindi il file e può chiuderlo e aprirlo di nuovo se viene raggiunto EOF. Va bene? Se eseguo fclose() su un descrittore di file, influisce sugli altri descrittori di file che puntano allo stesso file?Descrittori di file multipli per lo stesso file, C

risposta

3

Va bene. È possibile aprire tutte le volte che si desidera lo stesso file e ciascun descrittore di file sarà indipendente l'uno dall'altro.

0

Questo dovrebbe funzionare, a condizione che ogni thread abbia il proprio handle di file. Poiché si menziona l'uso di fclose(), ciò suggerisce che si sta utilizzando anche fopen() in ogni thread e che ogni thread ha effetto solo sulla propria variabile FILE *.

C'è un problema?

+0

Fondamentalmente, ho creato un array di due puntatori di file (perché ogni thread leggerà, ad esempio, file x), per un totale di thread y. quindi il mio array FILE * è array [y] [x]. Per un determinato thread i, apro un file tramite fopen (array [i] [0]) ad esempio (per il file 0). Poi leggo (fread) il file (non tutto in una volta però) e faccio altri compiti (non si verifica alcuna scrittura di file, però). Durante una lettura, se EOF viene raggiunto, lo faccio fclose e poi fopen di nuovo. La mia preoccupazione era che, quando fclose e fopen, potessi in qualche modo influenzare gli altri puntatori FILE * dagli altri thread che puntano allo stesso file che ho eseguito f close o – Gigi

+0

Supponendo che il tuo 'fopen()' sia un refuso (dovrebbe essere 'array [i] [0] = fopen' ...), allora sì, funzionerà bene. A condizione che ogni thread non manipoli i dati appartenenti ad altri thread. – wallyk

+0

Grazie. Sì, tutti i thread stanno facendo a questo file sono fopen(), fread() e fclose(). – Gigi

3

Per i sistemi Linux non è necessario più descrittori di file per farlo. È possibile condividere un singolo descrittore di file e utilizzare pread per eseguire in modo atomico un'operazione di ricerca/lettura senza modificare affatto il descrittore di file.

+0

'pread' è POSIX quindi non è limitato a Linux. –

Problemi correlati