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 (6 anni fa)] – creata Massimo Torquati | informatica:sol:laboratorio20:esercitazionib:readnwriten [03/05/2020 alle 10:44 (6 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 (6 anni fa) da Massimo Torquati
