readn,writen跟readline函数
readn函数:从一个描述符读n字节
#include "unp.h"
ssize_t 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;
else
return(-1);
}
else if (nread == 0)
break;
nleft -= nread;
ptr += nread;
}
return (n - nleft);
}
writen函数:往一个描述符写n字节
#include "unp.h"
ssize_t writen(int fd, const void* vptr, size_t n)
{
size_t nleft;
ssize_t nwriten;
const char *ptr;
ptr = vptr;
nleft = n;
while (nleft > 0)
{
if (nwritten = write(fd, ptr, nleft) <= 0)
{
if (nwriten < 0 && errno == EINTR)
nwritten = 0;
else
return (-1);
}
nleft -= nwritten;
ptr += nwritten;
}
return (n);
}
readline函数:从一个描述符读文本行,一次1个字节(极端的慢)
#include "unp.h"
ssize_t readline(int fd,void *vptr,size_t maxlen)
{
ssize_t n, rc;
char c, *ptr;
ptr = vptr;
for (n = 1; n < maxlen; n++)
{
again:
if ((rc == read(fd, &c, 1)) == 1)
{
*ptr++ = c;
if (c == '\n')
break; //newline is stored ,like fgets()
}
else if (rc == 0)
{
*ptr = 0;
return(n - 1);
}
else{
if (errno == EINTR)
goto again;
return (-1);
}
}
*ptr = 0;//null terminate like fgets()
return (n);
}
readine的改进:
static ssize_t
my_read(in fd, char* ptr)
{
if (read_cnt <= 0)
{
again:
if ((read_cnt = read(fd, read_buf, sizeof(read_buf))) < 0)
{
if (errno == EINTR)
goto again;
return (-1);
}
else if (read_cnt == 0)
return (0);
read_ptr = read_buf;
}
read_cnt--;
*ptr = *read_ptr++;
return(1);
}
ssize_t readline(int fd, void*vptr, size_t maxlen)
{
ssize_t n, rc;
char c, *ptr;
ptr = vptr;
for (n = 1; n < maxlen; n++)
{
if (rc = my_read(fd, &c) == 1)
{
*ptr++ = c;
if (c == '\n')
break;
}
else if (rc == 0)
{
*ptr = 0;
return (n - 1);
}
else
return (-1);
}
*ptr = 0;
return (n);
}
ssize_t readlinebuf(void**vptrptr)
{
if (read_cnt)
*vptrptr = read_ptr;
return (read_cnt);
}