一、第一版
#include <unistd.h> #include <errno.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; } } 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 <errno.h> #include <unistd.h> #define MAXLINE 4096 static 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的改进版,自带缓冲区 问题:使用静态变量实现跨域相继函数调用的状态信息维护,使函数变得不可重入或者说非线程安全