informatica:sol:laboratorio20:esercitazionib:readnwriten
Differenze
Queste sono le differenze tra la revisione selezionata e la versione attuale della pagina.
Prossima revisione | Revisione precedente | ||
informatica:sol:laboratorio20:esercitazionib:readnwriten [03/05/2020 alle 07:40 (5 anni fa)] – creata Massimo Torquati | informatica:sol:laboratorio20:esercitazionib:readnwriten [03/05/2020 alle 10:44 (5 anni fa)] (versione attuale) – Massimo Torquati | ||
---|---|---|---|
Linea 1: | Linea 1: | ||
===== Implementazione delle funzioni " | ===== Implementazione delle funzioni " | ||
- | (tratto da " | + | (tratto da " |
Linea 18: | Linea 18: | ||
We’ll never see this happen when reading or writing a disk file, except when the file | We’ll never see this happen when reading or writing a disk file, except when the file | ||
system runs out of space or we hit our quota limit and we can’t write all that we | system runs out of space or we hit our quota limit and we can’t write all that we | ||
- | requested. | + | requested.\\ |
- | + | ||
- | <code c> | + | |
- | ssize_t /* Read " | + | |
- | readn(int fd, void *ptr, size_t n) { | + | |
- | + | ||
- | } | + | |
- | <\code> | + | |
Generally, when we read from or write to a pipe, network device, or terminal, we | Generally, when we read from or write to a pipe, network device, or terminal, we | ||
need to take these characteristics into consideration. We can use the readn and | need to take these characteristics into consideration. We can use the readn and | ||
Linea 32: | Linea 24: | ||
handle a return value that’s possibly less than requested. These two functions simply | handle a return value that’s possibly less than requested. These two functions simply | ||
call read or write as many times as required to read or write the entire N bytes of | call read or write as many times as required to read or write the entire N bytes of | ||
- | data. | + | data.\\ |
+ | We call writen whenever we’re writing to one of the file types that we mentioned, | ||
+ | but we call readn only when we know ahead of time that we will be receiving a certain | ||
+ | number of bytes. Figure 14.24 shows implementations of readn and writen that we | ||
+ | will use in later examples. | ||
+ | Note that if we encounter an error and have previously read or written any data, we | ||
+ | return the amount of data transferred instead of the error. Similarly, if we reach the end | ||
+ | of file while reading, we return the number of bytes copied to the caller’s buffer if we | ||
+ | already read some data successfully and have not yet satisfied the amount requested. | ||
+ | |||
+ | <code c> | ||
+ | ssize_t | ||
+ | readn(int fd, void *ptr, size_t n) { | ||
+ | | ||
+ | | ||
+ | |||
+ | nleft = n; | ||
+ | while (nleft > 0) { | ||
+ | | ||
+ | if (nleft == n) return -1; /* error, return -1 */ | ||
+ | else break; /* error, return amount read so far */ | ||
+ | } else if (nread == 0) break; /* EOF */ | ||
+ | nleft -= nread; | ||
+ | | ||
+ | } | ||
+ | | ||
+ | } | ||
+ | |||
+ | ssize_t | ||
+ | writen(int fd, void *ptr, size_t n) { | ||
+ | | ||
+ | | ||
+ | |||
+ | nleft = n; | ||
+ | while (nleft > 0) { | ||
+ | | ||
+ | if (nleft == n) return -1; /* error, return -1 */ | ||
+ | else break; /* error, return amount written so far */ | ||
+ | } else if (nwritten == 0) break; | ||
+ | nleft -= nwritten; | ||
+ | | ||
+ | } | ||
+ | | ||
+ | } | ||
+ | </ |
informatica/sol/laboratorio20/esercitazionib/readnwriten.1588491654.txt.gz · Ultima modifica: 03/05/2020 alle 07:40 (5 anni fa) da Massimo Torquati