Linux服务器 - 文件操作 | 标准I/O库 | Linux文件IO深入剖析(标准文件I0概述)

标准I/O库

直接使用系统调用的缺点
(1) 影响系统性能
系统调用比普通函数调用开销大
因为,系统调用要进行用户空间和内核空间的切换
(2) 系统调用一次所能读写的数据量大小,受硬件的限制

       解决方案: 使用带缓冲功能的标准I/O库(以减少系统调用次数)
       
/* C语言中的文件操作中已描述 */
1) fwrite
2) fread
3) fopen
4) fclose
5) fseek    
6) fflush

Linux文件IO深入剖析

Linux服务器 - 文件操作 | 标准I/O库 | Linux文件IO深入剖析(标准文件I0概述)_第1张图片
某故事
惨不忍睹 - 差点赔付百万
时间: 2013年的某天下午
地点: 厦门市软件园二期望海路某栋3楼某大型IT公司

事件经过: 下午某时,一个重要客户的一封邮件不见了,客户要求公司赔偿他上百万的损失!在一个通宵后找到了问题所在,write 函数出问题了,邮件写入文件时write 返回成功,但写入大文件中的邮件内容不见了。一致认为write 函数执行完成后数据还没同步到物理存储的间隔系统出现宕机了…

血案场景还原
Linux服务器 - 文件操作 | 标准I/O库 | Linux文件IO深入剖析(标准文件I0概述)_第2张图片
具体代码(模拟)

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define TOTAL 10

int main(int argc, char *argv[])
{
     
    const char *TEXT = "This is a test.\n";
    const char *filename = "./write.txt";
    int fd = -1;
    int i = 0;

    fd = open(filename, O_RDWR|O_TRUNC|O_CREAT);
    if (fd < 0)
    {
     
        fprintf(stderr, "fopen %s failed, reason: %s. \nexit.\n", filename, strerror(errno));
        return -1;
    }

    for (i = 0; i < TOTAL; i++)
    {
     
        //sleep(1);
        if (writeToFile(fd, TEXT, strlen(TEXT)) < 0)
        {
     
            fprintf(stderr, "write to %s failed, reason: %s. \nexit. \n", filename, strerror(errno));
        }

        printf(" %d\n", i+1);
    }
    printf(" finished. \n");

    //int ret = fsync(fd);
    //if (ret) fprintf(stderr, "write failed. reason: %s\n", strerror(errno));

    printf("Start to sleep 30 seconds .......\n");
    sleep(30);

    close(fd);
    return 0;
}

int writeToFile(int fd, char *buf, int len)
{
     
    int wlen = 0;
    if (wlen = write(fd, buf, len) < 0)
    {
     
        fprintf(stderr, "write to %d failed. reason: %s \n", fd, strerror(errno));
        return -1;
    }

    //fsync(fd);
    return wlen;
}

正常生产线结果
Linux服务器 - 文件操作 | 标准I/O库 | Linux文件IO深入剖析(标准文件I0概述)_第3张图片
不正常的结果
Linux服务器 - 文件操作 | 标准I/O库 | Linux文件IO深入剖析(标准文件I0概述)_第4张图片
Linux服务器 - 文件操作 | 标准I/O库 | Linux文件IO深入剖析(标准文件I0概述)_第5张图片
再开机, 查看是否写入进去.
Linux服务器 - 文件操作 | 标准I/O库 | Linux文件IO深入剖析(标准文件I0概述)_第6张图片

Linux服务器 - 文件操作 | 标准I/O库 | Linux文件IO深入剖析(标准文件I0概述)_第7张图片
原因, 这和文件系统的IO流有关!
Linux服务器 - 文件操作 | 标准I/O库 | Linux文件IO深入剖析(标准文件I0概述)_第8张图片
下面对 Linux文件系统基本概念进行理解!!!

结语:

Linux服务器 - 文件操作 | 标准I/O库 | Linux文件IO深入剖析(标准文件I0概述)_第9张图片

时间: 2020-08-15

你可能感兴趣的:(Linux服务器,linux,ubuntu,c++)