2011-09-29 10 views
14

Hey favore, non mi importa se mi sto chiedendo domanda banale, ma, si prega di qualcuno può aiutarmi con questo ..Quali sono i vantaggi di pwrite e pread su fwrite e fread?

+0

Possibile duplicato di [Qual è la differenza tra read e pread in unix?] (Https://stackoverflow.com/questions/1687275/what-is-the-difference-between-read-and-pread-in- unix) –

risposta

11

È utile quando si eseguono operazioni di lettura/scrittura casuali. C'è anche un'opzione per Sqlite che sostituisce seek() + read() e seek() + write() con pread()/pwrite(). Perché è utile? seek() + read() e seek() + write() sono entrambi un paio di chiamate di sistema mentre pread() e pwrite() sono chiamate di sistema singolo. Meno chiamate di sistema: più efficienza.

+0

Ehi, ma come ottengo il descrittore di file .... Quando lo riapre mi restituisce un puntatore di file, quindi come posso ottenere un descrittore di file int ??? – Invictus

+0

pread/pwrite sono chiamate di sistema POSIX (ad es. Linux, FreeBSD ...). stanno lavorando con i descrittori di file UNIX che sono ints. puoi ottenerne uno usando open() syscall (funzione). guarda http://linux.die.net/man/2/pwrite – GreenScape

+0

@Invictus: 'FILE *' può essere convertito nel grezzo 'int'' fd' con ['fileno (3)'] (https://linux.die.net/man/3/fileno) se vuoi usare 'fopen', ma a volte usa il' fd' sottostante con le chiamate di sistema di basso livello. Si noti che le chiamate di sistema di basso livello non vedono il buffering dello spazio utente degli oggetti 'stdio'' FILE * ', quindi si potrebbero avere problemi se il buffer dello spazio utente dice una cosa e lo si ignora con' write'/' chiamate pwrite'/'read' /' pread'. – ShadowRanger

28

Ci sono due parti:

  1. differenza tra pread/pwrite e read/write:

    Sono entrambi allo stesso livello, ovvero chiamate di sistema. Ci sono due differenze:

    1. Le varianti "p" prendono l'offset da cui leggere, quindi sono indipendenti dal puntatore del file corrente. Ciò rende più facile la lettura/scrittura da più thread contemporaneamente.
    2. Le varianti "p" funzionano solo su file ricercabili (cioè file reali, non pipe, socket o dispositivi).
  2. Differenza tra read/pread/write/pwrite e fread/fwrite:

    Le varianti "f" sono involucri runtime standard di ex (utilizzando le varianti di base). Supportano il buffering in-process. Ciò può migliorare in modo significativo le prestazioni per codice semplice, ma rende impraticabili altre funzionalità del livello di chiamata di sistema.

utilizzare solo le varianti "P" se si dispone di un buon uso per la lettura di offset casuale (evitando cerca e permettendo l'accesso simultaneo tramite un handle di file), che spesso il caso con un qualche tipo di file di database (record- orientato con record a offset conosciuti) e raramente in altre applicazioni.

+0

Eh? Non vedo alcun supporto per scatter-gather in pread()/pwrite(). Forse intendevi readv()/writev()? Alcuni sistemi come Linux e alcune varianti BSD hanno "combination" syscalls preadv()/pwritev() ma non fa ancora parte di POSIX. – janneb

+0

@janneb: Hm, giusto. Ho erroneamente ricordato qualcosa e in realtà non ho letto la pagina man, anche se l'ho aperta. –

+0

Ehi, ma come ottengo il descrittore di file .... Quando lo riapre mi restituisce un puntatore di file, quindi come posso ottenere un descrittore di file int ??? – Invictus

2

La posizione del file corrente non cambia dopo una chiamata a pread/pwrite.

Anche perché non c'è bisogno di chiamare lseek per cambiare la posizione del file corrente pread/pwrite evitare potenziali condizioni di gara quando più thread sono coinvolti.

Problemi correlati