writen函數(shù)定義
#include <unistd>
ssize_t write(int filedes, void *buf, size_t nbytes);
// 返回:若成功則返回寫入的字節(jié)數(shù)恭应,若出錯(cuò)則返回-1
// filedes:文件描述符
// buf:待寫入數(shù)據(jù)緩存區(qū)
// nbytes:要寫入的字節(jié)數(shù)
在unp1中對writen進(jìn)行了封裝
ssize_t /* Write "n" bytes to a descriptor. */
writen(int fd, const void *vptr, size_t n)
{
size_t nleft;
ssize_t nwritten;
const char *ptr;
ptr = vptr;
nleft = n;
while (nleft > 0) {
if ( (nwritten = write(fd, ptr, nleft)) <= 0) {
if (nwritten < 0 && errno == EINTR)
nwritten = 0; /* and call write() again */
else
return(-1); /* error */
}
nleft -= nwritten;
ptr += nwritten;
}
return(n);
}
/* end writen */
void
Writen(int fd, void *ptr, size_t nbytes)
{
if (writen(fd, ptr, nbytes) != nbytes)
err_sys("writen error");
}
read函數(shù)定義
#include <unistd>
ssize_t read(int filedes, void *buf, size_t nbytes);
// 返回:若成功則返回讀到的字節(jié)數(shù)壹店,若已到文件末尾則返回0甲葬,若出錯(cuò)則返回-1
// filedes:文件描述符
// buf:讀取數(shù)據(jù)緩存區(qū)
// nbytes:要讀取的字節(jié)數(shù)
unp1中對read的封裝
ssize_t /* Read "n" bytes from a descriptor. */
readn(int fd, void *vptr, size_t n)
{
size_t nleft;
ssize_t nread;
char *ptr;
ptr = vptr;
nleft = n;
while (nleft > 0) {
if ( (nread = read(fd, ptr, nleft)) < 0) {
if (errno == EINTR)
nread = 0; /* and call read() again */
else
return(-1);
} else if (nread == 0)
break; /* EOF */
nleft -= nread;
ptr += nread;
}
return(n - nleft); /* return >= 0 */
}
/* end readn */
ssize_t
Readn(int fd, void *ptr, size_t nbytes)
{
ssize_t n;
if ( (n = readn(fd, ptr, nbytes)) < 0)
err_sys("readn error");
return(n);
}
有幾種情況可使實(shí)際讀到的字節(jié)數(shù)少于要求讀的字節(jié)數(shù):
- 1 讀普通文件時(shí),在讀到要求字節(jié)數(shù)之前就已經(jīng)達(dá)到了文件末端允跑。例如抖拴,若在到達(dá)文件末端之前還有30個(gè)字節(jié),而要求讀100個(gè)字節(jié)笙僚,則read返回30成福,下一次再調(diào)用read時(shí)碾局,它將返回0(文件末端)。
- 2當(dāng)從終端設(shè)備讀時(shí)奴艾,通常一次最多讀一行净当。
- 3當(dāng)從網(wǎng)絡(luò)讀時(shí),網(wǎng)絡(luò)中的緩存機(jī)構(gòu)可能造成返回值小于所要求讀的字結(jié)束蕴潦。
- 4當(dāng)從管道或FIFO讀時(shí)像啼,如若管道包含的字節(jié)少于所需的數(shù)量,那么read將只返回實(shí)際可用的字節(jié)數(shù)潭苞。
- 5當(dāng)從某些面向記錄的設(shè)備(例如磁帶)讀時(shí)忽冻,一次最多返回一個(gè)記錄。
- 6當(dāng)某一個(gè)信號(hào)造成中斷此疹,而已經(jīng)讀取了部分?jǐn)?shù)據(jù)僧诚。