readline.c
发布日期:2021-08-17 10:08:13 浏览次数:26 分类:技术文章

本文共 1848 字,大约阅读时间需要 6 分钟。

一、第一版

#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的改进版,自带缓冲区问题:使用静态变量实现跨域相继函数调用的状态信息维护,使函数变得不可重入或者说非线程安全

 

转载于:https://www.cnblogs.com/soldierback/p/10669131.html

转载地址:https://blog.csdn.net/weixin_30846599/article/details/99254945 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:常用正则表达式
下一篇:js对手机软键盘的监听

发表评论

最新留言

很好
[***.229.124.182]2024年04月18日 05时53分11秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

SpringBoot 整合 MongoDB 之 MongoTemplate 实现 CRUD、分页接口 2021-06-30
[增删改查] SpringBoot 整合 Solr 之 SolrClient 实现 CRUD、分页接口、高亮显示 2021-06-30
[Python爬虫] 模拟浏览器、代理ip、开启日志、超时处理、异常处理、登录、下载图片 2021-06-30
在 SpringBoot 中使用 @EnableAsync、@Async 轻松实现异步任务 2019-04-27
《学习 Go 语言》学习心得 2019-04-27
[汇编语言] 带有颜色的字符串显示(hello world 级别程序) 2019-04-27
[增删改查] Python 之使用 Django + LayUI 做后台管理 2019-04-27
Docker 镜像容器 之 导出导入、上传镜像到 DockerHub 上、Nexus私库 的引入 2019-04-27
centos7 下将 Django2.0 项目部署到 阿里云 上(uwsgi3 +Nginx ) 2019-04-27
前后端分离 SpringBoot + SpringSecurity 权限解决方案 2019-04-27
前后端分离 SpringBoot + SpringSecurity + JWT + RBAC 实现用户无状态请求验证 2019-04-27
[Python爬虫] 使用 Beautiful Soup 4 快速爬取所需的网页信息 2019-04-27
在 Centos7 下使用 Docker 快速搭建 Hadoop 集群 2019-04-27
Python web 框架 Flask 蓝图的正确使用姿势 2019-04-27
领扣LintCode算法问题答案-1053. 至少是其他数字两倍的最大数 2019-04-27
领扣LintCode算法问题答案-1054. 最少费用的爬台阶方法 2019-04-27
领扣LintCode算法问题答案-1056. 请找出大于目标的最小字母 2019-04-27
领扣LintCode算法问题答案-1062. 洪水填充 2019-04-27
领扣LintCode算法问题答案-1068. 寻找数组的中心索引 2019-04-27
领扣LintCode算法问题答案-1071. 词典中最长的单词 2019-04-27