linux 一次io大小,Linux——标准IO篇
主要知识点:
标准IO(fopen、perror、fputc、fgetc,stdin、三种缓冲区、读写偏移、fseek、ftell、fgets、fputs)
[主要内容]
【1】IO
IO: input
output输入输出
IO:对文件的读写操作
IO: 标准IO、文件IO
标准IO:采用库函数的方式对文件进行读写操作(对文件的操作函数接口功能出自于库文件)
文件IO:采用系统调用的方式对文件进行读写操作(对文件的操作函数接口功能出自于内核)
缓冲区:在当前进程所占的内存空间的虚拟空间;
【系统调用:】
内核提供的接口层,应用程序可以通过此接口层实现内核为应用层提供的各种功能
系统调用的流程:
封装函数----》系统调用接口(软中断)-----》系统调用服务例程(编号)-----》内核函数(完成任务)
1)处理器的状态发生改变
用户态--内核态
表示处理器的执行级别,目的访问到内核进程的使用的内存
2)系统调用的编号
每一个系统调用的函数接口都会对应一个编号
/lib/modules/3.2.0-29-generic-pae/build/include/asm-generic
3)参数的传递
普通函数传参,通过将参数放到进程栈区实现;
在系统调用中,首先将函数使用的参数,放到cpu的寄存器,在执行内核函数之前,将参数从寄存器取出,放到内核进程的栈区
【2】标准IO
标准IO:
对文件进行访问操作时,内核此时建立缓冲区,当对文件进行读写操作时,先操作缓冲区,当缓冲区满足条件之后,再执行系统调用,由内核完成数据交互,减少系统调用的次数,提高执行效率。
标准I/O库的所有操作都是围绕流(stream)来进行的,在标准I/O中,流用FILE*来描述。
FILE:
每个被使用的文件都在内存中开辟一个区域,用来存放文件的有关信息,这些信息是保存在一个结构体类型的变量中,该结构体类型是由系统定义的,取名为FILE
使用:先打开,后访问
《函数原型:FILE
*fopen(const
char *path, const char *mode);
功能:打开一个文件
参数:path 路径名或文件名
mode:
r
以只读的方式打开文件,如果文件不存在,报错;文件必须存在
r+
以读写的方式打开文件,如果文件不存在,报错;文件必须存在
w
以只写的方式打开文件,如果文件不存在,自动创建;如果文件存在,清空文件中原有的数据 (单个进程内是追加写)
w+
以读写的方式打开文件,如果文件不存在,自动创建;如果文件存在,清空文件中原有的数据
a
以只写的方式打开文件,如果文件不存在,自动创建;如果文件存在,将数据写入到文件末尾
a+
以读写的方式打开文件,如果文件不存在,自动创建;如果文件存在,追加到文件末尾
返回值:成功 流指针失败 NULL
《 函数原型:void
perror(const
char *s);
功能:打印系统错误消息
内核将函数执行出错之后所对应的错误码保存在变量errno,此函数根据变量errno中所保存的错误码,打印对应的错误消息
函数原型:char *strerror(int
errnum);
功能:返回错误码所对应的错误消息
参数:errno 变量
285 char*
_IO_buf_base; 缓冲区的开始地址
286 char*
_IO_buf_end; 缓冲区的结束地址
在对应的目录下建立索引:
1)进入到目录中
2)建立索引(sudo ctags -R)
3)vi -t + 关键词
4)追踪 ctrl + }
5)返回上一层 ctrl + t
【3】标准io对文件的操作
1)以字符、字符串的形式对文件进行读写
2)以数据单元的形式对文件进行读写
1)《函数原型:int
fputc(int
c,FILE *stream);
功能:向文件中写入一个字符
参数:c 写入的字符
stream 流指针
返回值:成功 写入的字符 ; 失败 EOF
注:如果c不是字符,会在插入的时候转换为字符;返回值是整形,如果不是则根据ASCII码转换成整形;判断条件:判断返回值是否是EOF
函数原型:int fgetc(FILE
*stream);
功能:从文件中读取一个字符
参数:stream 流指针
返回值:成功 读取的字符
失败 EOF
注:返回值是整形,如果不是则根据ASCII码转换成整形,输出用%c就行;
判断条件:判断返回值是否是EOF
标准I/O预定义3个流,他们可以自动地为进程所使用(访问终端、系统定义、FILE *型)
stdin 标准输入流指针 默认终端输入
stdout 标准输出流指针 默认终端输出
stderr 标准错误输出流指针 默认终端输出错误消息(打印错误的提示信息,
fprintf(stderr,"Userage
errpr: ./a.out + filename");)
实例:也可以利用main函数参数表里的参数传参;
fgetc(stdin)
从终端读取一个字符;
fputc(stdout) 从终端输出一个字符;
【4】缓冲区
1)全缓冲区--当流指针与文件相关联时,此时缓冲区是全缓冲区
(使用标准IO函数接口实现对文件进行操作,此时操作的缓冲区为全)
FILE *fp
=fopen("test.txt");
! 刷新条件:程序正常退出
缓冲区填满
强制刷新fflush(fp)
\n 换行
大小:4096 4K
2)行缓冲区--当流指针与终端相关联时,此时缓冲区是行缓冲区
(使用标准IO函数接口实现对终端的操作,此时操作的缓冲区为行)
stdin stdout
! 刷新条件:程序正常退出
缓冲区填满
强制刷新 fflush(fp)
‘\n’ (换行符)
大小:1024 1K
3)不缓冲区--没有缓冲区
stderr
大小: 0
【5】读写位置----读写偏移
读写位置的定位:
读写操作会引起fp的读写位置偏移
《 1.函数原型: int
fseek(FILE *stream, long offset, int whence);
功能:对文件读写位置定位
参数:
stream 流指针
offset 偏移量
相对于第三个参数再次发生的偏移
whence
SEEK_SET 定位到文件的开始处
SEEK_CUR
定位到文件的当前位置
SEEK_END
定位到文件的末尾处
返回值: 成功 0
失败 -1
《 2.
函数原型:long
ftell(FILE
*stream);
功能:获取当前的读写位置(从0开始)
获取当前读写位置相对于文件开始处的偏移量
返回值:成功 当前读写位置的值
失败 -1
【注意:】
当打开文件已a、a+的方式打开时,对该文件执行定位,定位操作成功,再次读写时,依然以文件的末尾处开始;当打开文件已w、w+的方式打开时,对该文件执行定位,定位操作成功,再次读写时,从当前定位开始,覆盖写;
【6】以字符串的形式对文件进行读写
《 函数原型:int
fputs(const
char *s, FILE *stream);
功能:写字符串到文件中
参数:s 写入的字符串
stream 流指针
返回值:成功 非负数
失败 EOF
《函数原型:char
*fgets(char
*s, int size, FILE *stream);
功能:
从文件中读取字符串-----------》(size足够大,保证一次能够处理一行) 常用来读取一行数据!
参数:s 保存读取的字符串
size 期望读取的字节数
stream 流指针
返回值:成功 读取的字符串
失败 NULL
注: 会自动追加‘\0’
=================================================================
无‘\n’换行符
当size >
文件中的数据的字节数,可以将数据全部读取,fgets在数据的末尾补'\0',表示字符串读取结束
size = 128 文件: hello
world
读取结果:hello
world'\0'
当size
<=文件中的数据的字节数,最多读取size-1个字符,fgets在数据的末尾补'\0',表示字符串读取结束
size = 9 文件:hello
world
读取结果:hello wo'\0'
==================================================================
有‘\n’
当size >
当前换行符‘\n’与上一次换行符‘\n’之间的数据的字节数,fgets遇到'\n',在‘\n’后补‘\0’,表示字符串到此执行结束
(size足够大,保证一次能够处理一行)
size = 128
文件:aaaaa'\n'bbbbb'\n'ccccc‘\n’
读取结果:1)aaaaa‘\n’'\0'
2)bbbbb'\n''\0'
3)ccccc‘\n’'\0'
当size <=
当前换行符‘\n’与上一次换行符‘\n’之间的数据的字节数,最多读取size-1个字符,fgets在数据的末尾补'\0',表示字符串读取结束
size = 5
文件:aaaaa'\n'bbbbb'\n'
读取结果:1)aaaa'\0'
2)a‘\n’'\0'
3)bbbb'\0'
4)b'\n''\0'
==================================================================
linux 一次io大小,Linux——标准IO篇相关推荐
- IO输入输出及标准IO函数
[1]什么是IO #include <stdio.h> input:输入,从外部存储设备输入到内存中 output: 输出,从内存输出到外部存储设备. > 存储设备: > &g ...
- 如何查看linux系统的存储空间大小,linux 如何查看硬盘大小,存储空间大小等系统信息及硬件信息...
一.linux CPU大小 [root@idc ~]# cat /proc/cpuinfo |grep "model name" && cat /proc/cpui ...
- linux 一次io大小,linux – AWS EBS中IO操作(IOP)的大小是多少?
一个I / O操作的大小取决于很多事情.计算应用程序的平均值并不一定是个坏主意. 亚马逊对它们的定义意味着它们的硬件支持256KB块.单个I / O操作是读取或写入一个块.即使软件和硬件块大小匹配,对 ...
- linux lv在线缩小大小,Linux使用lvresize扩展或缩减lv大小
环境:CentOS 6.7 一.新建并挂载目录 /u01 和 /data 1.创建目录挂节点/u01,/data mkdir -p /{u01,data} 2.创建lv,名称是lv_u01,大小10g ...
- linux看java堆大小,linux 改java堆内存大小
linux 改java堆内存大小 [2021-02-08 23:06:29] 简介: linux查内存大小的方法:首先打开应用程序:然后选择系统工具选项,并单击系统终端选项:接着在系统终端命令行输入 ...
- linux统计某个目录大小,Linux下统计某个目录的文件个数(转)
eclipse 建立maven项目 转自:http://www.cnblogs.com/candle806/p/3439469.html Eclipse+Maven创建webapp项目 1.开启ecl ...
- linux快速统计目录大小,linux下统计文件夹、文件的大小--du
Linux下统计文件夹大小 du -sh ./ 统计文件夹占用的空间 find ./ -type f xargs ls -l awk 'BEGIN { size=0;}{size+=$5};END{p ...
- linux查看根目录的大小,linux下查看根目录或当前目录大小
df 可以查看一级文件夹大小.使用比例.档案系统及其挂入点,但对文件却无能为力. du 可以查看文件及文件夹的大小. 1. df -h [www@idc01-xxxxx]$ df -h Filesy ...
- 查看linux设备Ran的大小,linux – 来自/ dev / zero和/ dev / urandom的不同文件大小
dd status=progress if=/dev/zero of=/tmp/testfile.zer bs=100M count=10 dd status=progress if=/dev/ura ...
最新文章
- 斯坦福大学Christopher Manning:Transformer语言模型为什么能取得突破
- Qt之excel 操作使用说明
- Flutter开发之数据存储-3-数据库存储(34)
- Spring Cloud构建微服务架构:分布式配置中心(加密解密)
- Python—程序设计:抽象工厂模式
- python好学实用吗-都说python很简单 真的很好学么?
- sublime text3 添加到右键菜单
- Java中length,length(),size()的区别
- 清北学堂模拟赛d6t2 刀塔
- java读取图片成rgb二维数组
- ThinkPHP空操作及命名空间
- SecoClient 百度云安装包 亲测有效
- MT4跟单系统如何查询交易品种的合约规格?
- 苹果中国官网新增蚂蚁花呗 24 期分期免息服务
- 解决源码编译Python3后缺少ssl tkinter,bz2等库的问题
- 【C++】C++基础语法
- Android 底部导航栏-极致简单版
- Project2 分段切割路面,只取一个种子点
- 基于数字电路交通灯信号灯控制系统设计-基于单片机病房温度监测与呼叫系统设计-基于STM32的无线蓝牙心电监护仪系统设计-基于STM32的智能蓝牙温控风扇控制设计-基于STM32的智能温室控制系统设计
- 中国天气网免费天气预报接口API