zoukankan      html  css  js  c++  java
  • readline.c

    一、第一版

    #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 == '
    ') {
                    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 == '
    ') {
                    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的改进版,自带缓冲区
    问题:使用静态变量实现跨域相继函数调用的状态信息维护,使函数变得不可重入或者说非线程安全
  • 相关阅读:
    Sql 三元运算符
    连表更新
    SQL分组排序去重复
    ASP日常出错原因
    Box2D的三种Body类型
    Android获取屏幕尺寸的方法
    AndEngine之ScreenCapture
    AndEngine之IUpdateHandler,IEntityModifier
    JAVA中线程安全的类
    AndEngine引擎之SmoothCamera 平滑摄像机
  • 原文地址:https://www.cnblogs.com/soldierback/p/10669131.html
Copyright © 2011-2022 走看看