zoukankan      html  css  js  c++  java
  • 深入理解计算机系统(第三版)第十章重要内容摘要

    10.1Unix I/O

     

    10.2文件

    10.3打开和关闭文件

     

     

     

    10.4读和写文件

     

     

     

     

    10.5.1RIO的无缓冲的输入输出函数

    ssize_t rio_readn(int fd, void *usrbuf, size_t n) 
    {
        size_t nleft = n; //剩下未读字符数
        ssize_t nread;
        char *bufp = usrbuf;
    
        while (nleft > 0) {
        if ((nread = read(fd, bufp, nleft)) < 0) {
            if (errno == EINTR)  //被信号处理函数中断
            nread = 0;      //本次读到0个字符,再次读取
            else
            return -1;      //出错,errno由read设置
        } 
        else if (nread == 0) //读取到EOF
            break;              
        nleft -= nread; //剩下的字符数减去本次读到的字符数
        bufp += nread;  //缓冲区指针向右移动
        }
        //返回实际读取的字符数
        return (n - nleft);         /* return >= 0 */
    }
    ssize_t rio_writen(int fd, void *usrbuf, size_t n) 
    {
        size_t nleft = n;
        ssize_t nwritten;
        char *bufp = usrbuf;
    
        while (nleft > 0) {
        if ((nwritten = write(fd, bufp, nleft)) <= 0) {
            if (errno == EINTR)  
            nwritten = 0;    
            else
            return -1;       
        }
        nleft -= nwritten;
        bufp += nwritten;
        }
        return n;
    }

    10.5.2RIO的带缓冲的输入函数

     

     

     

    void rio_readinitb(rio_t *rp, int fd) 
    {
        rp->rio_fd = fd;  
        rp->rio_cnt = 0;  
        rp->rio_bufptr = rp->rio_buf;
    }

     

    static ssize_t rio_read(rio_t *rp, char *usrbuf, size_t n)
    {
        int cnt;
    
        while (rp->rio_cnt <= 0) {  //缓冲区为空,调用read填充
        rp->rio_cnt = read(rp->rio_fd, rp->rio_buf, 
                   sizeof(rp->rio_buf));
        if (rp->rio_cnt < 0) {
            if (errno != EINTR) /* Interrupted by sig handler return */
            return -1;
        }
        else if (rp->rio_cnt == 0)  /* EOF */
            return 0;
        else 
            rp->rio_bufptr = rp->rio_buf; /* Reset buffer ptr */
        }
    
        /* Copy min(n, rp->rio_cnt) bytes from internal buf to user buf */
        cnt = n;          
        if (rp->rio_cnt < n)   
        cnt = rp->rio_cnt;
        memcpy(usrbuf, rp->rio_bufptr, cnt);
        rp->rio_bufptr += cnt;
        rp->rio_cnt -= cnt;
        return cnt;
    }
    ssize_t rio_readlineb(rio_t *rp, void *usrbuf, size_t maxlen) 
    {
        int n, rc;
        char c, *bufp = usrbuf;
    
        for (n = 1; n < maxlen; n++) { 
            if ((rc = rio_read(rp, &c, 1)) == 1) {
            *bufp++ = c;
            if (c == '
    ') {
                    n++;
                 break;
                }
        } else if (rc == 0) {
            if (n == 1)
            return 0; //第一次读取就到了EOF
            else
            break;    //读了一些数据后遇到EOF
        } else
            return -1;      /* Error */
        }
        *bufp = 0;
        return n-1;
    }
    ssize_t rio_readnb(rio_t *rp, void *usrbuf, size_t n) 
    {
        size_t nleft = n;
        ssize_t nread;
        char *bufp = usrbuf;
        
        while (nleft > 0) {
        if ((nread = rio_read(rp, bufp, nleft)) < 0) 
                return -1;          /* errno set by read() */ 
        else if (nread == 0)
            break;              /* EOF */
        nleft -= nread;
        bufp += nread;
        }
        return (n - nleft);         /* return >= 0 */
    }

    10.6读取文件元数据

     

     

    10.7读取目录内容

     

     

    10.8共享文件

     

     

     

    10.9I/O重定向

     

    10.10标准I/O

    10.11综合:我该使用哪些I/O函数

     

     

     

  • 相关阅读:
    解决首次访问网上邻居密码错误,而造成的以后都无权访问的解决方案。
    MapX开发日记(二)
    对于一个网卡绑定多个IP的问题。
    .net VS 全角问题
    DotnetBar MapX中动态生成可以查询地图数据的弹出菜单问题
    sqlServer 字符型字段默认为空字符串
    MapX开发日记(一)
    ASP.NET Dbtype属性无效 与系统自带控件为英文
    原创 c# 封装的带CheckBox的DataGridViewColumnHeaderCell 源码部分 实现DataGridView列头带CheckBox控件实现全选功能,支持列头带标题
    关于去共享锁获取脏数据
  • 原文地址:https://www.cnblogs.com/GodZhuan/p/14295874.html
Copyright © 2011-2022 走看看