Se I fopen
un file, qual è la differenza tra chiamare fclose
o close
e quale dovrei usare?Differenza tra fclose e close
Se i bambini biforcati hanno accesso anche al file, cosa dovrebbero fare quando hanno finito con il file?
Se I fopen
un file, qual è la differenza tra chiamare fclose
o close
e quale dovrei usare?Differenza tra fclose e close
Se i bambini biforcati hanno accesso anche al file, cosa dovrebbero fare quando hanno finito con il file?
fclose()
è una funzione correlata ai flussi di file . Quando apri il file con l'aiuto di fopen()
e assegni lo stream a FILE *ptr
. Quindi utilizzerai fclose()
per chiudere il file aperto.
close()
è una funzione connessa con descrittori di file. Quando apri il file con l'aiuto di open()
e assegna il descrittore a . Quindi utilizzerai close()
per chiudere il file aperto.
Le funzioni come fopen()
, fclose()
ecc sono funzioni C standard di, mentre l'altra categoria di open()
, close()
ecc sono specifiche POSIX. Ciò significa che il codice scritto con open()
, close()
ecc. Non è un codice C standard e quindi non portatile. Mentre il codice scritto con fopen()
, fclose
ecc. È un codice standard e può essere portato su qualsiasi tipo di sistema.
quale devo usare?
Dipende da come è stato aperto il file. Se apri un file con fopen()
, devi utilizzare fclose()
e se apri il file con open()
, devi utilizzare close()
.
Se i bambini biforcati hanno accesso anche al file, cosa devono fare quando hanno finito con il file?
Questo dipende anche da dove hai effettuato la chiamata fork()
: prima di aprire il file o dopo averlo aperto.
See: Are file descriptors shared when fork()ing?
See: man fclose
e man close
open()
e close()
sono chiamate di sistema UNIX che restituiscono e prendono descrittori di file, per l'uso con altre chiamate di sistema UNIX come write()
. fopen()
e fclose()
sono funzioni di libreria C standard che funzionano su FILE*
s, per l'utilizzo con elementi come fwrite
e fprintf
. Questi ultimi sono quasi sempre quelli che dovresti usare: sono più semplici e più multipiattaforma.
Per quanto riguarda la seconda domanda, i bambini biforcute hanno lo stesso descrittore di file numerico come il genitore, ma è una copia; possono chiuderlo e sarà ancora aperto per i genitori e gli altri bambini. (Anche se personalmente, non mi piace avere i file aperti quando ho fork()
... Mi piace rendere esplicito questo tipo di utilizzo condiviso delle risorse. I pipe, ovviamente, sono un'eccezione.)
quale devo usare?
Se si apre un file con fopen
, chiuderlo con fclose
. L'utilizzo di close
in questo caso potrebbe causare una perdita di memoria su un handle assegnato da fopen
Un'ultima cosa da ricordare. Gli stream C FILE * utilizzano internamente l'I/O bufferizzato. fclose() svuota questo buffer e chiude il descrittore di file a livello di sistema operativo. close() 'un flusso FILE * potrebbe non svuotare questo buffer interno e si potrebbero perdere dati. Quindi per i flussi C utilizzare sempre le funzioni C fxxx(). –