zoukankan      html  css  js  c++  java
  • Linux 标准 I/O 库

    为什么要设计标准 I/O 库?

    1. 直接使用 API 进行文件访问时,需要考虑许多细节问题,例如:read 、 write 时,缓冲区的大小该如何确定,才能使效率最优
    2. read 和 write 等底层系统调用函数进行输入输出时,在用户态内核态之间来回切换,每次读出或写入的数据量较少,导致频繁的 I/O 操作,增加了系统开销

    标准 I/O 库是 ANSI C 规范的一部分,函数原型在文件 stdio.h中定义,对底层 I/O 系统

    调用进行了封装,为程序员提供了带有格式转换功能的输入输出操作,并在用户空间

    增加了缓冲区管理

    • 分离了应用程序空间和实际的物理设备
    • 减少了直接读盘次数,提高性能
    1. 读取前查看是否已存在页缓存中,如果已经存放在了页缓存中,数据立即返回给应用程序
    2. 写数据前先写到页缓存中,如果用户采用的是同步写机制 synchronous writes )),

          那么数据会立即被写回到磁盘上,应用程序会一直等到数据被写完为止;

            如果用户采用的是延迟写机制deferred writes ),那么应用程序就完全不需要等到数据

           全部被写回到磁盘,数据只要被写到页缓存中去就可以了。

    fopen() 函数

        

        

    fdopen() 函数

        

    // fdopen 函数示例
    FILE *fp;
    int fd;
    if ((fp = fopen ("hello.txt", "w+")) == NULL)
    	printf("fopen file error
    ");
    	return 0;}
    fprintf(fp , "hello word
    ");
    fclose(fp);
    if ((fd = open("hello.txt", O_RDWR )) == 1) {
    	printf("open file fail
    ");
    	return 0;}
    if ((fp = fdopen( fd , "a+")) == NULL)
    	printf("fdopen open
    ");
    	return 0;
    }
    fprintf(fp , "linux c program");
    fclose(fp);
  • 相关阅读:
    QtAV编译
    git 恢复到刚刚clone下来的状态
    select2 清除选中项解决办法
    mysql: 查看某库表大小
    C# Linq 交集、并集、差集、去重
    mvc ajax访问后台时session过期无法跳转到Login页面问题解决
    Asp.net:上传文件超过了最大请求长度
    Firebug 没死,活在 Firefox DevTools 中
    vs2015 加载项目的时启动:无法启动 IIS Express Web 服务器
    Visual Studio安装SVN插件
  • 原文地址:https://www.cnblogs.com/51try-again/p/11037303.html
Copyright © 2011-2022 走看看