GNU/Linux >> Linux Esercitazione >  >> Linux

fopen() è una funzione thread-safe in Linux?

Se due thread aprono entrambi lo stesso file con fopen() , ognuno avrà flussi di file indipendenti (FILE * ) supportato da descrittori di file indipendenti che fanno riferimento allo stesso file. È possibile scrivere in modo indipendente sui due flussi di file, ma il risultato netto sul file dipenderà da dove scrivono i thread e da quando scaricano il flusso di file. I risultati sono imprevedibili a meno che tu non controlli dove sta scrivendo ogni thread. La cosa più semplice è assicurarsi che entrambi i thread utilizzino lo stesso flusso di file, ma probabilmente è comunque necessario coordinarsi tra i thread. Nota che POSIX richiede le funzioni C per fornire un accesso coordinato al flusso di file — vedi flockfile() che impone il requisito che

Tutte le funzioni che fanno riferimento a (FILE *) oggetti, eccetto quelli con nomi che terminano in _unlocked , si comporteranno come se usassero flockfile() e funlockfile() internamente per ottenere la proprietà di questi (FILE *) oggetti.

Se apri il file in modalità accodamento in entrambi i thread, le scritture sarebbero ogni volta al sicuro alla fine del file, ma devi comunque preoccuparti di svuotare i dati prima che il buffer si riempia.

Per inciso, se apri il file in modalità accodamento (O_APPEND con open() , utilizzando "a" con fopen() ), quindi tutte le scritture dovrebbero trovarsi alla fine del file e non dovresti avere problemi con le scritture interleaved, a meno che, forse, i tuoi thread indipendenti non utilizzino flussi di file e scrivano più di un buffer pieno alla volta, oppure stanno usando fflush() dopo aver scritto parti di ogni riga di output, oppure stanno usando write() o uno dei suoi innumerevoli parenti per scrivere ogni volta parti di una riga. Ci sono modi per incorrere in problemi anche con la modalità di aggiunta, ma in genere devi provare a incontrarli.


fopen() è rientrabile e puoi avere tutti i descrittori che puntano allo stesso file quanti vuoi.

Ciò che ottieni come risultato della lettura/scrittura da/sul file utilizzando più descrittori non è una domanda di sicurezza del thread, ma piuttosto un accesso simultaneo al file, che nella maggior parte dei casi (a parte quando il file è di sola lettura) non funzionerà bene.


Linux
  1. Nozioni di base sui permessi dei file Linux

  2. Linux:tutto è un file?

  3. Come creare thread in Linux (con un programma di esempio C)

  4. C fopen vs open

  5. I thread del kernel di Linux sono davvero processi del kernel?

Come creare un file in Linux

Meno comandi in Linux

Comando Gzip in Linux

Comando Gunzip in Linux

Comando Stat in Linux

Cos'è umask in Linux?