自己加了注释方便理解,希望帮到更多难以理解这段代码的人…
/* my_read和readline的关系是,
* readline调用my_read,my_read先读入需要的全部数据进入自己的缓冲区,
* 每次my_read返回一个字符,循环至readline通过调用间接把read_buf缓存区内的数据读取完毕。
* 已读取的字节数由read_cnt存储,在第一次被调用之后的每次调用都通过该变量自减来判断缓存是否已被readline读取完。
* 在被读取完之前,每次被调用时read_cnt是>0的,所以经过第一个if判断之后,
* 都只有这句话*ptr = *read_ptr++;起作用,作用是把缓冲区里的下一个字符返回给readline,让readline来判断是否读到了'\n'
* 当--read_cnt;执行至read_cnt为0时,my_read内的第一个if条件成立,执行if内的代码,返回给readline一个0,此时调用者知道缓存区内的数据已经被读取完了
*/
#include <stdint.h>
#include <errno.h>
#include <string.h>
#include "stdio.h"
#include "unistd.h"
#define MAXLINE 40
static ssize_t my_read(int fd, char *ptr);
ssize_t readline(int fd, void *vptr, size_t maxlen);
static ssize_t read_cnt = -127;//设置一个为负数的初始值
static char *read_ptr;
static char read_buf[MAXLINE];
int main(void) {
return 0;
}
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;
} else {
return (-1);
}
} else if (read_cnt == 0) {
return (0);
} else {//读取成功且返回值不等于0
read_ptr = read_buf;
}
}
--read_cnt;
*ptr = *read_ptr++;
return (1);
}
ssize_t readline(int fd, void *vptr, size_t maxlen) {
char c, *ptr = vptr;
ssize_t n, rc;
for (n = 1; n < maxlen; ++n) {
if ((rc = my_read(fd, &c)) == 1) {
*ptr++ = c;
if (c == '\n') {
break;
}
} else if (rc == 0) {
*ptr = NULL;
return (n - 1);
} else {
return (-1);
}
}
*ptr = NULL;
return (n);
}