2013-10-24 13 views
5

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?

+2

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(). –

risposta

7

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

0

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.

0

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.)

0

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