只实现了head/tail的基本功能,默认显示十行及-n参数。
一、使用带缓冲的系统调用。
write/read等系统调用是不带缓冲的,可以包装一层,使其带缓冲。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 == ' ') { if (++num == count) { break; } } } else if (rc == 0) { if (i == 1) { return 0; } else { break; } } else { return -1; } } *buf = '