readn,writen和readline函数

来源:互联网 发布:如何判断协议数据单元 编辑:程序博客网 时间:2024/06/08 08:02

微笑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 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;
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的改进:

#include   "unp.h"
static int read_cnt;
static char *read_ptr;
static char read_buf[MAXLINE];

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);
}

0 0
原创粉丝点击