基础IO:

  c库文件IO操作接口:(详细查看c语言中的文件操作函数总结:https://www.cnblogs.com/cuckoo-/p/10560640.html)

    fopen  打开文件  fclose   关闭文件  fread  读取文件  fwrite  写入文件  

    fseek  移动跳转当前读取/写入位置  

    printf    格式化字符串输出到终端  

    printf("%s-%s-%s-%d\n", "bite", "good", 666);

    sprintf  格式化字符串,将格式化后的字符串写入一个buff中

    sprintf(buff, "%s-%s-%s-%d\n", "bite", "good", 666);

    fprintf   格式化字符串,将格式化后的字符串写入文件中

    fprintf(stdout, "%s-%s-%s-%d\n", "bite", "good", 666);

    //stdout 标准输出——显示——linux下一切皆文件

  系统调用I/O函数:

    int open(const char* pathname, int flags, mode_t mode)

      pathname:要打开的文件名称

      flags:标志选项

        必选项:(这三个选项相互冲突,只能选择其中一个)

          O_RDONLY  只读

          O_WRONLY  只写

          O_RDWR   读写

        非必选项:

          O_CREAT  若文件存在打开,不存在则创建

          O_EXCL  与O_CREAT同时用时,若文件存在则报错

          O_TRUNC  若文件存在则将文件长度截断为0

          O_APPEND  追加

      mode:若文件不存在需要创建的时候,用于指定创建的文件权限

      返回值:

        成功:非负整数(文件描述符,后续操作都通过描述符完成)

        失败:-1

  

    write(int fd, const void* buf, size_t count)

      从buf中想fd所代表的文件写入count个字节的数据

      返回值:返回实际的写入长度,出错返回-1

    read(int fd, void* buf, size_t  count)

      从fd所代表的文件中读取count字节长度的数据放到buf中

      返回实际读取的数据长度,出错返回-1

    lseek(fd, 0, SEEK_SET)

      跳转fd所代表的文件读写位置至起始位置的0偏移量处

  库函数和系统调用接口之间的关系:上下级调用关系

    库函数时对系统调用的一层封装  

  文件描述符:
    定义:返回一个数字,通过数字来管理文件
    进程通过struct file 结构体来描述打开的文件—使用了struct file* fd——array[]

    文件描述符就是这个数组的下标,操作系统通过file结构体描述文件
    并且将指针添加进入fd_array中,向用户返回这个文件描述信息在数组中的下标

    分配规则:
      最小未使用原则:默认从3开始,因为一个程序在运行时会默认打开3个文件

  文件描述符和文件流指针的关系:

         标准输入  标准输出  标准错误输出  

文件流指针    stdin    stdout    sterr 

文件描述符    0       1       2   

    文件指针用于库函数操作IO

    文件描述符用于系统调用接口操作IO

    文件流指针结构体中包含了一个成员就是我们的文件描述符

    文件流指针中还定义了一个缓冲区,我们所说的换行刷新缓冲区,实际就是刷新的这个缓冲区,这

个缓冲区用于将短小数据组成大数据一次性写入文件,这样可以提高效率(换行刷新缓冲区,只针对标准输

出),而系统调用则没有这个缓冲区。

  进程对文件的管理方式:先描述,在组织管理

    使用结构体来描述:

      文件标识符(inode结点号)  文件名称

重定向:
  改变数据流向,将写入指定文件的数据,改变之后写入另一个文件
  重定向值得是描述符的重定向,因为描述符并没有改变,改变的是描述符所对应的文件信息

  1.标准输出重定向:

    原本标准输入读取数据重新定向为从其他文件读取数据

    将原来要输出到标准输出的内容,重定向后输出到指定的其他文件

    <:标准输入重定向

    >:标准输出重定向  清空原有内容后添加新内容

    >>:标准输出重定向  向原有内容下方添加新内容

  dup2(int oldfd, int newfd)
  功能:让newfd指向oldfd所指向的文件;
  如果newfd本身已经打开了文件,则关闭原先打开的文件
  则nwefd和oldfd操作的都是oldfd所指向的文件

文件系统的理解: 

  文件系统(linux下ext2为例):
  磁盘上的文件管理系统(每一个磁盘分区上都会有一个文件管理系统,除了交换分区)

  分块管理:
  数据块区域
  inode结点区域
    inode结点:包含文件大小;权限;时间;占用块数,链接;文件数据存储地址;
  data_bitmap区域
    记录inode结点哪些是空闲的或者已经使用的
  超级块区域
    文件信息的统筹,以上分块的所有信息

  目录文件:
    记录了目录下文件的信息(文件名+inode结点号)——目录项
  文件存储的过程:
    通过inode_bitmap在inode区域获取空闲的inode结点,通过data_bitamap获取空闲数据块,在inode结点中记录文件
    信息以及数据快位置,并且将文件数据写入到数据块中。将自己的目录项信息添加到所在文件中

  文件读取过程:
    在目录项中通过文件名获取文件inode结点号(文件唯一)通过inode结点号在inode区域找inode区域找到inode结点,
    通过inode结点中的数据块地址信息,在指定数据块读取数据。

  查看inode结点大小:
    sudo dumpe2fs -h /dev/sda1 | grep "Inode size"

  软链接/硬链接(操作一个软/硬链接可以改变原文件)
    ln -s 原文件 创建的软链文件
    是一个独立的文件(像快捷方式)

    ln -h 原文件 创建的硬链文件
    一个文件的名字(目录项),与源文件公用一个inode结点

    ls -i (查看文件inode结点号)
    创建的硬链接文件的结点号与原文件相同
    软链中存储的是文件的路径——针对目录项

    软/硬链接的区别:
      删除源文件,软链接文件将失效;硬链接无影响,链接数-1(一个文件的链接数为0 时才是真正的删除了)
      软链接可以跨分区建立,硬链接不可以
      软链接可以对目录创建,硬链接不可以
      (软链接的操作可以跨分区,硬链接不可以)
  动态库/静态库

    动态库命名:lib前缀 .so是后缀 中间是库名称
    -fPIC //产生位置无关代码(课后调研,查找了解)
    1.gcc -fPIC -c child.c -o child.o
    2.gcc --share child.o -o libmychild.so(生成动态库/共享库)

  静态库命名:lib前缀 .a是后缀 中间是库名称
    gcc -c child.c -o child.o
    ar -cr libmychild.a child.o
    -c 创建静态库
    -r 模块替换

  链接库:
    gcc main.c -o main -lmychild
    -l 指定要链接的库名称(只取库名称)
    库文件有默认的搜索路径:lib/lib64/usr/lib64...

    链接时报错,没有找到库,原因:有默认搜索路径
    1.将库文件放入指定路径下 //根目录下lib64
    2.设置/声明环境变量:
      库文件的链接搜索路径:LIBRARY_PATH = .
      库文件的运行加载路径:LD_LIBRARY_PATH = .export
    3.在gcc生成可执行程序时,直接指定库的搜索路径
      gcc main.c -o main -L . -lmychild

      gcc -L //指定库的链接搜索路径

      gcc -I //指定头文件的搜索路径

    想使用第三方静态库,不能用 gcc 的 -static 选项,因为 -static 选项是生成静态链接可以执行
    程序,所有的库都是使用静态库(但我们只希望这个第三方库使用静态库,而不是所有),因此我们的做法
    是将第三方静态库拷贝到指定路径下,使用-L选项指定库的链接搜索路径那么这时候链接的就是静态库。

基础I/O的更多相关文章

  1. java基础集合经典训练题

    第一题:要求产生10个随机的字符串,每一个字符串互相不重复,每一个字符串中组成的字符(a-zA-Z0-9)也不相同,每个字符串长度为10; 分析:*1.看到这个题目,或许你脑海中会想到很多方法,比如判 ...

  2. node-webkit 环境搭建与基础demo

    首先去github上面下载(地址),具体更具自己的系统,我的是windows,这里只给出windows的做法 下载windows x64版本 下载之后解压,得到以下东西 为了方便,我们直接在这个目录中 ...

  3. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  4. Golang, 以17个简短代码片段,切底弄懂 channel 基础

    (原创出处为本博客:http://www.cnblogs.com/linguanh/) 前序: 因为打算自己搞个基于Golang的IM服务器,所以复习了下之前一直没怎么使用的协程.管道等高并发编程知识 ...

  5. [C#] C# 基础回顾 - 匿名方法

    C# 基础回顾 - 匿名方法 目录 简介 匿名方法的参数使用范围 委托示例 简介 在 C# 2.0 之前的版本中,我们创建委托的唯一形式 -- 命名方法. 而 C# 2.0 -- 引进了匿名方法,在 ...

  6. HTTPS 互联网世界的安全基础

    近一年公司在努力推进全站的 HTTPS 化,作为负责应用系统的我们,在配合这个趋势的过程中,顺便也就想去搞清楚 HTTP 后面的这个 S 到底是个什么含义?有什么作用?带来了哪些影响?毕竟以前也就只是 ...

  7. Swift与C#的基础语法比较

    背景: 这两天不小心看了一下Swift的基础语法,感觉既然看了,还是写一下笔记,留个痕迹~ 总体而言,感觉Swift是一种前后端多种语言混合的产物~~~ 做为一名.NET阵营人士,少少多多总喜欢通过对 ...

  8. .NetCore MVC中的路由(1)路由配置基础

    .NetCore MVC中的路由(1)路由配置基础 0x00 路由在MVC中起到的作用 前段时间一直忙于别的事情,终于搞定了继续学习.NetCore.这次学习的主题是MVC中的路由.路由是所有MVC框 ...

  9. .NET基础拾遗(5)多线程开发基础

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...

  10. .NET 基础 一步步 一幕幕[面向对象之方法、方法的重载、方法的重写、方法的递归]

    方法.方法的重载.方法的重写.方法的递归 方法: 将一堆代码进行重用的一种机制. 语法: [访问修饰符] 返回类型 <方法名>(参数列表){ 方法主体: } 返回值类型:如果不需要写返回值 ...

随机推荐

  1. bzoj3681: Arietta(网络流)

    传送门 主席树优化建图? 然而我连代码都看不懂 贴个题解好了->这里 //minamoto #include<iostream> #include<cstdio> #in ...

  2. 解读人:李琼,Metabolic profiling of tumors, sera and skeletal muscles from an orthotopic murine model of gastric cancer associated-cachexia(胃癌相关恶病质的原位小鼠模型中肿瘤,血清和骨骼肌的代谢谱分析)

    发表时间:(2019年4月) IF:3.950 单位: 厦门大学 厦门理工大学 物种:小鼠的肿瘤,血清和骨骼肌 技术:核磁共振代谢组学分析 一. 概述:(用精炼的语言描述文章的整体思路及结果) 本研究 ...

  3. dblink 简单使用

    create extension dblink查看连接:select dblink_get_connections()断开所有连接:select dblink_disconnect()断开指定名称的连 ...

  4. 我的省选 Day -9

    Day -9 不知不觉,日子已经变成一位数了,已经到了最后关头了. 早上班主任在上数学课时告诉我们,高校自招的降分政策已经没有以前那么优惠了(这我知道啊) 于是老师间接的暗示了奥赛如果没拿到省一就没什 ...

  5. [APIO2019T1]奇怪装置

    考古学家发现古代文明留下了一种奇怪的装置.该装置包含两个屏幕,分别显示两个整数x和y.经过研究,科学家对该装置得出了一个结论:该装置是一个特殊的时钟,它从过去的某个时间点开始测量经过的时刻数t,但该装 ...

  6. Linq to xml 读取xml文件或xml字符串

    XMLFile1.xml: XDocument Contacts = XDocument.Load("XMLFile1.xml"); //XElement Contacts = X ...

  7. CF10D/POJ2127 LCIS解题报告

    题目传送门(洛谷)(CF)(POJ) 前言 期末考试前的最后一篇题解,希望期末考  rp++ 奇怪,为什么在CF上能过的代码到POJ上就 听取WA声一片  (不管了) 题目思路 LCIS模版O(n²) ...

  8. ch8 -- directMethod

    稀疏直接法 主要用的g2o的方法.自己定义了一个新的一元边.边的误差项是测量值和由估计得来的x,y对应的灰度值之间的误差.导数为灰度对像素坐标的导数乘以像素坐标对yi*李代数的导数的负数.灰度对于像素 ...

  9. Swing实现canvas-nest.js 源码

    #### 说明 canvas-nest.js 源码 http://www.bubuko.com/infodetail-2237716.html 地址:https://gitee.com/dgwcode ...

  10. Sharepoint 图片库字段名称(Title)和对应的内部名称(InternalName)

    做项目遇到需要查看列表库的内部名称,因为用的是图片库,所以就列出所有对应关系,以备查看方便: