一、第一版
#include#include 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; } } else if (rc == 0) { *ptr = 0; return (n - 1); } else { if (errno == EINTR) { goto again; } return (-1); } } *ptr = 0; return ((maxlen == (n-1))?(n-1):n);}函数功能:从一个描述符读文本行,一次一个字节
二、改进版
#include#include #define MAXLINE 4096static int read_cnt = 0;static char *read_ptr;static char read_buf[MAXLINE];static ssize_t my_read(int 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 (c == 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);}功能:readline的改进版,自带缓冲区问题:使用静态变量实现跨域相继函数调用的状态信息维护,使函数变得不可重入或者说非线程安全