• 《APUE》第三章笔记(2)


    read函数

    调用read函数从打开的文件中读数据。

    #include <unistd.h>

    ssize_t read(int filedes, void *buf, size_t nbytes);

    返回值:若成功则返回读到的字节数,若文件已到结尾则返回0,出错返回-1


    有多种情况可使实际读到的字节数少于要求读的字节数

    1.读普通文件时,在读到要求字节数之前已到达了文件尾端。例如,若在到达文件尾端之前还有30个字节,而要求读100个字节,则read返回30.下一次再调用read时,它将会返回0(文件尾端)。

    2.当从终端设备读时,通常一次最多读一行(能够改变)。

    3.从网络读时,网络中的缓冲机构可能造成返回值小于所要求读的字节数(也就是说,你要求读的字节数大于网络中的缓冲区长度了)。

    4.其他(现在暂时用不到也就不写了)


    write函数

    调用write函数为打开的文件写数据

    #include <unistd.h>

    ssize_t write(int filedes, const void *buf, size_t nbytes);

    返回值:若成功则返回已写的字节数,出错返回-1


    其返回值通常与参数nbytes的值相同,否则表示出错。出错的常见原因是:磁盘已写满,或者超过了一个给出进程的文件长度限制。


    I/O效率

    所有常用的UNIX系统shell都提供一种方法,它在标准输入上打开一个文件用于读,在标准输出上创建(或重写)一个文件。这使得程序不必自行打开输入和输出文件。


    下面一个程序是将标准输入复制到标准输出:

    /*Copy standard input to standard output*/
    #include "apue.h"
    
    #define BUFFSIZE	4096
    
    int main(void)
    {
    	int	n;
    	char	buf[BUFFSIZE];
    
    	while ((n = read(STDIN_FILENO, buf, BUFFSIZE)) > 0)
    		if (write(STDOUT_FILENO, buf, n) != n)
    			err_sys("write error");
    
    	if (n < 0)
    		err_sys("read error");
    
    	exit(0);
    }
    因为是终端的标准输入和标准输出,就不用打开和关闭了。


    结果如下:


    第三章笔记待续。


  • 相关阅读:
    [程序员代码面试指南]递归和动态规划-换钱的方法数(DP,完全背包)
    [程序员代码面试指南]递归和动态规划-换钱的最少货币数(DP,完全背包)
    [程序员代码面试指南]数组和矩阵-未排序数组中累加和为给定值的最长子数组长度
    浅谈RDD
    Java中的移位操作符
    Boolean类源码分析
    IntegerCache详解
    Java Integer类分析
    ArrayList LinkedList Vector
    java的"=="与"equals"
  • 原文地址:https://www.cnblogs.com/fusae-blog/p/4256796.html
Copyright © 2020-2023  润新知