只实现了head/tail的基本功能,默认显示十行及-n参数。
     
  一、使用带缓冲的系统调用。
     
  write/read等系统调用是不带缓冲的,可以包装一层,使其带缓冲。
typedef struct
{
    int rio_fd;
    int rio_cnt;
    char *rio_bufptr;
    char rio_buf[RIO_BUFFSIZE];
}rio_t;
 
void rio_readinitb(rio_t *rp, int fd)
{
    rp->rio_fd = fd;
    rp->rio_cnt = 0;
    rp->rio_bufptr = rp->rio_buf;
}
 
ssize_t rio_read(rio_t *rp, void *usrbuf, size_t n)
{
    int cnt = 0;
 
    while (rp->rio_cnt <= 0)
    {
        if ((rp->rio_cnt = read(rp->rio_fd, rp->rio_buf, sizeof(rp->rio_buf))) < 0)
        {
            if (errno != EINTR)
            {
                return -1;
            }
        }
        else if (rp->rio_cnt == 0)
        {
            return 0;
        }
        else
        {
            rp->rio_bufptr = rp->rio_buf;
        }
    }
 
    //cnt = n > rp->rio_cnt?rp->rio_cnt:n;
 
    cnt = n;
    if (n > rp->rio_cnt)
    {
        cnt = rp->rio_cnt;
    }
 
    memcpy(usrbuf, rp->rio_bufptr, cnt);
    rp->rio_cnt -= cnt;
    rp->rio_bufptr += cnt;
 
    return cnt;
}
 
ssize_t rio_readlineb(rio_t *rp, void *usrbuf, size_t maxlen, int count)
{
    int i = 0, rc = 0, num = 0;
    char c = 0, *buf = usrbuf;
 
    lseek(rp->rio_fd, maxlen, SEEK_END);
 
    for (i = 1; i < maxlen; i++)
    {
        if ((rc = rio_read(rp, &c, 1)) == 1)
        {
            *buf++ = c;
            if (c == '\n')
            {
                if (++num == count)
                {
                    break;
                }
            }
        }
        else if (rc == 0)
        {
            if (i == 1)
            {
                return 0;
            }
            else
            {
                break;
            }
        }
        else
        {
            return -1;
        }
    }
 
    *buf = '\0';
    return i;
}
View Code

     二、head命令实现

相关文章:

  • 2021-07-17
  • 2021-12-26
  • 2021-09-09
  • 2022-12-23
  • 2021-12-30
  • 2021-11-30
  • 2021-05-04
  • 2021-05-21
猜你喜欢
  • 2021-06-10
  • 2021-06-09
  • 2022-12-23
  • 2022-12-23
  • 2021-09-15
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案