Linux中的系统IO与标准IO
2023-09-11 14:21:43 时间
一、系统IO与标准IO的区别
什么是系统IO与标准IO:(IO为Input/Output,即输入/输出接口)
- 系统IO:由操作系统直接提供的接口函数
- 标准IO:由标准C库(第三方库)提供的接口函数(通过封装操作系统提供的系统IO,再给用户使用)
系统IO和标准IO的主要区别:
- 系统IO:不带缓冲机制,系统IO可以操作普通文件与驱动文件
- 标准IO:带缓冲机制,标准IO只可以操作普通文件。提供多种的格式的输入输出如(字符串、整形......)
缓冲的作用与刷新条件
- 作用:
- 在进行数据的读写的过程中,先不把数据直接写入或者读入设备中,而是写或者读入内存空间,当满足一定条件时候,将该空间的文件写入文件或设备中。这样可以减少操作系统调用驱动程序或文件的次数,提高读写的速度,和代码的效率。因为每一次系统调用的过程都是很浪费系统资源的。
刷新条件:
- 缓冲区已满
- 强制刷新
- 程序结束
- 关闭文件
- 例1:
- 系统IO与标准IO的示意图:
- 例2
- 系统IO与标准IO的区别示意图
二、使用系统IO与标准IO的常见步骤
设备文件:
- open打开设备文件
- mmap映射设备地址
- close关闭设备文件
- 对映射的内存操作.......
普通文件:(若需要格式化输入输出)
- fopen打开普通文件
- 对文件的读/写 (fscanf,fprintf,fread,fwrite........)
- fclose关闭文件
三、常用系统IO以及标准IO的详细参数
注意:在使用API接口的时候,我们只要注意需要什么参数,以及参数的返回值!
一、打开文件:open 与 fopen(可以在linux中使用 man 2 open 与 man 3 fopen 查看详细手册)
系统IO
头文件:
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
接口函数:
- int open(const char *pathname, int flags);
参数解析:
- 参数一、需要打开文件的路径名(pathname)
- 参数二、打开文件的权限请求(flags)
- O_RDONLY, //只读
- O_WRONLY, //只写
- O_RDWR. //读写
- O_CREAT//带创建打开
- O_EXCL//检测文件是否存放
- O_NOCTTY//以不阻塞方式打开
- O_TRUNC//以清空方式打开
- O_APPEND//以追加方式打开
返回值:
- 成功:返回 文件描述符
- 失败:返回 -1
标准IO
头文件:
- #include <stdio.h>
接口函数:
- FILE *fopen(const char *path, const char *mode);
参数解析:
- 参数一、需要打开的路径名(path)
- 参数二、打开文件的权限(mode)
- "r" 只读
- "r+" 读写
- w" 只写,带创建 :存在清空
- "w+" 读写, 带创建 :存在清空
- "a" 只写并追加 带创建
- "a+" 读写并追加 带创建
返回值:
- 成功:返回文件指针
- 失败:返回 NULL
二、读取文件:read 和 fread (在linux中可以用 man 2 read 和 man 3 fread 来查看详细手册)
系统IO
头文件:
- #include <unistd.h>
接口函数:
- ssize_t read(int fd, void *buf, size_t count);
参数解析:
- 参数一、文件描述符(fd)
- 参数二、从文件读取数据后,存放的缓存地址
- 参数三、需要读取的字节数
返回值:
- 成功:成功读取到的字节数
- 失败:0 读取到的文件是0字节 或者 已经读到文件末尾
- -1 读取数据失败
标准IO
头文件:
- #include <stdio.h>
接口函数:
- size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
参数解析:
- 参数一、存放数据的缓存地址(ptr)
- 参数二、数据类型大小 / 数据块大小(size)
- 参数三、多少个这样的数据(块) (nmemb)
- 参数四、需要读取的文件指针(stream)
返回值:
- 成功:读取到的字节块数量(注意:不是字节数)
- 失败:返回 0 或者 -1
三、写入文件: write 和 fwrite (在linux中可以使用man 2 write 和 man 3 fwrite查看详细手册)
系统IO
头文件:
- #include <unistd.h>
函数接口:
- ssize_t write(int fd, const void *buf, size_t count);
参数解析:
- 参数一、文件描述符(fd)
- 参数二、需要写入文件的数据的缓存地址(buf)
- 参数三、写入文件的字节大小(count)
返回值:
- 成功:成功写入的字节数
- 失败: 返回 -1
标准IO
头文件:
- #include <stdio.h>
函数接口:
- size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
参数解析:
- 参数一、需要写入的数据的缓存地址
- 参数二、写入的数据类型大小 / 数据块大小
- 参数三、写入数据块的数量
- 参数四、需要写入的文件指针
返回值:
- 成功:返回写入数据块的个数(注意:不是字节数!)
- 失败: 返回 -1
五、光标移动 lseek 和 fseek (在linux中可以使用man 2 lseek 和 man 3 fseek查询详细手册)
系统IO
头文件:
- #include <sys/types.h>
- #include <unistd.h>
接口函数:
- off_t lseek(int fd, off_t offset, int whence);
参数解析:
- 参数一、文件描述符(fd)
- 参数二、光标偏移量(offset)
- 参数三、光标位置来源(whence)
- SEEK_SET 文件头开始
- SEEK_CUR 光标的当前位置开始
- SEEK_END 从文件末尾开始
返回值:
- 成功:返回 偏移量的大小
- 失败:返回 -1
标准IO
头文件:
- #include<stdio.h>
函数接口:
- int fseek(FILE *stream, long offset, int whence);
参数解析:
- 参数一、文件指针(stream)
- 参数二、光标偏移量(offset)
- 参数三、光标位置来源(whence)
- SEEK_SET 文件头开始
- SEEK_CUR 光标的当前位置开始
- SEEK_END 从文件末尾开始
六、关闭文件
系统IO
头文件:
- #include <unistd.h>
函数接口:
- int close(int fd);
参数解析:
- 参数一、文件描述符
返回值:
- 成功:返回 0
- 失败:返回 -1
标准IO
头文件:
- #include<stdio.h>
函数接口:
- int fclose(FILE *fp);
参数解析:
- 参数一、文件描述符(fd)
返回值:
- 成功:返回 0
- 失败:返回 EOF
相关文章
- linux下Shell编程--标准的守护进程的启动脚本
- [Linux]linux下取消用户名和密码直接登录
- [uart]linux串口的阻塞非阻塞切换
- linux那点事儿(五)----用户管理常用命令
- linux 文件属性与权限
- 【学习总结】快速上手Linux玩转典型应用-第2章-linux简介
- linux下使用shell脚本自动化部署项目
- Linux装B命令
- linux fedora35中配置软件存储库:添加、启用、禁用
- linux 错误码 65280,Android:无法在同一部手机上执行通过Linux部署编译的文件
- 【ubuntu】全站最详细Linux学习指南大全(建议添加收藏)
- linux 重定向 标准错误与标准输出到同一文件
- L84.linux命令每日一练 -- 第11章 Linux系统管理命令 -- rpm和yum
- L71.linux命令每日一练 -- 第十章 Linux网络管理命令 -- wget和mailq
- L53.linux命令每日一练 -- 第八章 Linux磁盘与文件系统管理命令 -- dd和mount
- L35.linux命令每日一练 -- 第五章 Linux信息显示与搜索文件命令 -- which和whereis
- nohup 输出到指定文件 Linux nohup 实现命令后台运行并输出或记录到指定日志文件 设置日志结果文件名称 重定向到某个文件 标准误 标准错误输出定向
- 02 从头开始atac项目 ubuntu20 install r4.2 Linux系统环境配置 服务器版本的rstudio r install in linux /ubuntu/centos
- linux标准输入/输出/错误
- F4nniu 的常用 Linux 命令(2021-04-02)
- Linux下安装Scim-googlepinyin输入法和设置Sublime Text中文输入
- Linux配置浮动IP
- 【python | linux 01】《字符和列表》其实就是这么简单~~~