C Programmazione

Funzione di lettura POSIX nella programmazione C

Funzione di lettura POSIX nella programmazione C
Nei tradizionali sistemi operativi compatibili POSIX, per ottenere informazioni da un documento contenuto in un file system, un programma utilizzava la chiamata di sistema read. Un descrittore di documento a cui di solito si accede da una precedente chiamata ad aprire è definito dal file. Questa chiamata di sistema di lettura legge le informazioni in byte e l'intero di cui il chiamante specifica dal documento, quindi le salva in un buffer fornito dal meccanismo di chiamata.

Definizione della funzione

Prima di definire la funzione di lettura nel tuo codice, devi includere alcuni pacchetti richiesti.

#includere

Ecco come definire la funzione di lettura POSIX:

>> ssize_t pread(int fildes, void *buf, size_t nbyte, off_t offset);
>> ssize_t read(int fd, void *buf, size_t nbytes);

Dalla chiamata al metodo read possono essere presi tre argomenti di parametro:

int fd: Il descrittore del file da cui devono essere lette le informazioni. Potremmo utilizzare un descrittore di file acquisito tramite una chiamata di sistema aperta, oppure potremmo semplicemente usare 0, 1 o 2 riferendosi rispettivamente a input tipico, output regolare o errore regolare.

Vuoto *bu: Il buffer o l'array di caratteri in cui salvare e conservare i dati letti and.

Dimensione_t nbyte: Il numero di byte da leggere dal documento prima del troncamento. Tutte le informazioni possono essere memorizzate nel buffer se le informazioni da leggere sono inferiori a nbytes.

Descrizione

Il metodo read() prova a leggere 'nbyte' nella cache del buffer indicata da 'buf' dal file connesso con il descrittore di documento aperto 'Fildes' o 'fd'. Non definisce la natura di più letture simultanee sullo stesso flusso, FIFO o unità terminale.

Sui documenti che abilitano la lettura, il processo di lettura inizia all'offset del documento e l'offset viene incrementato del numero di byte letti. Se l'offset del documento è in corrispondenza o oltre il bordo del file, non ci sono byte letti e read() non ne restituisce nessuno.

Quando il conteggio è 0, read() riconoscerà gli errori menzionati di seguito. Se non ci sono errori, o se read() non viene contabilizzato con Errors, un read() restituisce zero con un conteggio di 0 e quindi non ha altre ripercussioni.

Se il conteggio è maggiore di SSIZE_MAX, come da POSIX.1, allora il risultato è determinato dall'implementazione.

Valore di ritorno

Il numero di byte 'read' e 'pread' ripristinato al raggiungimento deve essere un numero intero non negativo mentre zero punta alla fine del file. La posizione del documento viene fatta avanzare di questo numero, oppure, per segnalare un errore, i metodi restituiscono -1 e assegnano 'errno'. Quando questa cifra è inferiore al numero di byte richiesti, non è un errore byte. Potrebbe essere possibile che per ora siano disponibili meno byte.

Errori

La funzione pread e read avrà esito negativo se si verificano questi errori:

ANCORA:

Il documento o il descrittore di file 'fd' appartiene a un file non socket che è stato etichettato come non bloccante (O NONBLOCK) e bloccherà la lettura.

BLOCCO BLOCCO:

Il descrittore 'fd' appartiene a un socket che è stato etichettato come non bloccante (O_NONBLOCK) e bloccherà la lettura.

EBADF:

Il 'fd' potrebbe non essere un descrittore utilizzabile, o potrebbe non essere aperto per la lettura.

EFAULT:

Questo accade quando il tuo "buf" è al di fuori dello spazio degli indirizzi raggiungibile.

ENTR:

Prima della lettura dei dati informativi, la chiamata potrebbe essere interrotta da un segnale.

EINVAL:

Questo errore si verifica quando il tuo descrittore 'fd' è coinvolto in un oggetto, che non è appropriato per la lettura, o il documento è stato slegato con il flag O_DIRECT, e l'uno o l'altro indirizzo indicato in 'buf', il valore indicato in 'count ', o l'offset del documento non è associato in modo appropriato.

EINVAL:

Il descrittore 'fd' potrebbe essere stato formato usando una chiamata a timerfd_create(2) e il buffer di dimensioni errate è stato dato da leggere.

OEI:

È un errore di input/output. Si verifica quando il gruppo di processi in background tenta di leggere dal proprio terminale di regolamentazione e l'uno o l'altro sta ignorando o bloccando SIGTTIN o il suo gruppo di processi è in lutto. Un altro motivo di questo errore potrebbe essere un errore di input/output di basso livello durante la lettura da un disco rigido o da un nastro. Un'altra potenziale causa di EIO sui file di dati in rete è la rimozione del blocco consultivo sul descrittore di file e il fallimento di tale blocco.

EISDIR:

Il descrittore di file 'fd' appartiene a una directory.

Appunti:

Possono verificarsi anche molti altri errori, dipendenti dall'oggetto collegato al descrittore 'fd'. Entrambi i moduli size_t e ssize_t sono tipi di dati numerici non contrassegnati e contrassegnati definiti da POSIX.1. Su Linux, possono essere trasmessi al massimo 0x7ffff000 (2,147,479,552) byte tramite la funzione di lettura (e chiamate di sistema equivalenti), restituendo il numero di byte originariamente trasmessi (su piattaforme sia a 32 bit che a 64 bit). Con i filesystem NFS, solo il primo momento in cui il timestamp viene modificato leggendo piccoli flussi di informazioni, le chiamate successive non lo farebbero. Viene attivato dalla memorizzazione nella cache degli attributi lato client poiché, sebbene non tutti, i client NFS smettono di aggiornarsi al server tramite st_atime (ora dell'ultimo accesso al file) e le letture lato client soddisfatte dal buffer del client non attiverebbero modifiche a st- atime sul server poiché non sono disponibili letture lato server. Rimuovendo la memorizzazione nella cache degli attributi lato client, è possibile accedere ai metadati UNIX, ma ciò aumenterebbe significativamente il carico sul server e influirebbe sulla produttività nella maggior parte dei casi.

Esempio 01:

Ecco un programma C per dimostrare la chiamata alla funzione di lettura sul sistema Linux. Scrivi il comando sottostante così com'è in un nuovo file. Aggiungi librerie e, nella funzione principale, inizializza un descrittore e una dimensione. Il descrittore sta aprendo il file e la dimensione viene utilizzata per leggere i dati del file.

L'output per il codice sopra sarebbe come mostrato nell'immagine qui sotto.

Esempio 02:

Di seguito viene fornito un altro esempio per illustrare il funzionamento della funzione di lettura.

Crea un altro file e scrivi il codice qui sotto così com'è dentro. Ecco due descrittori, fd1 e fd2, che hanno entrambi il proprio accesso al file della tabella aperta. Quindi per foobar.txt, ogni descrittore ha la sua posizione del file. Il primo byte di foobar.txt è tradotto da fd2, e il risultato è c = f, non c = o.

Conclusione

Abbiamo letto la funzione di lettura POSIX nella programmazione C in modo efficiente. Speriamo che non ci siano più dubbi.

Tutorial Shadow of the Tomb Raider per Linux
Shadow of the Tomb Raider è la dodicesima aggiunta alla serie Tomb Raider, un franchise di giochi d'azione e avventura creato da Eidos Montreal. Il gi...
Come aumentare gli FPS in Linux?
FPS sta per Fotogrammi al secondo. Il compito dell'FPS è misurare il frame rate nelle riproduzioni video o nelle prestazioni di gioco game. In parole ...
I migliori giochi di laboratorio dell'app Oculus
Se possiedi un visore Oculus, devi essere informato sul sideloading. Il sideloading è il processo di installazione di contenuti non archiviati sul vis...