嵌入式Linux—文件IO
文件IO
在 Linux 系统中,一切都是“ 文件”:普通文件、驱动程序、网络通信等等。所有的操作,都是通过“文件 IO”来进行的。所以,很有必要掌握文件操作的常用接口。
Linux系统的文件有哪些

Linux 的文件既可以是真实保存到存储介质的文件也可以是自身内核提供的虚拟文件,还可以是设备节点 。
访问文件的方式
| 类型 | 方法 |
|---|---|
| 通用的 IO 模型: | open/read/write/lseek/close |
| 非通用的函数 | ioctl/mmap |
Linux下的帮助方法
| 方法 | 功能 |
|---|---|
| xxx --help | 单个命令的用法 |
| man 分类号 xxx | 用法与函数详细介绍(最常用) |
| info | 更加详细的内容(不常用) |
man的9大分类:
1 Executable programs or shell commands // 命令
2 System calls (functions provided by the kernel) // 系统调用,比如 man 2 open
3 Library calls (functions within program libraries) // 函数库调用
4 Special files (usually found in /dev) // 特殊文件, 比如 man 4 tty
5 File formats and conventions eg /etc/passwd // 文件格式和约定, 比如 man 5 passwd
6 Games // 游戏
7 Miscellaneous (including macro packages and conventions), e.g. man(7), groff(7) //杂项
8 System administration commands (usually only for root) // 系统管理命令
9 Kernel routines [Non standard] // 内核例程
系统调用怎么进入内核以及内核的 sys_open、 sys_read 会做什么
详见《完全开发手册》P171-P172
文件IO的常用函数(可通过man方法获取更多细节)
| 函数 | 功能 |
|---|---|
| int open(const char *pathname, int flags, mode_t mode); | 建立一条到文件或设备的访问路径,返回文件描述符。mode参数只有使用 O_CREAT 标志创建一个新文件时才有效。 |
| ssize_t read(int fd, void *buf, size_t count); | 通过文件描述符读字节到缓冲区(物理内存),并返回字节数,若文件为空,则返回-1 |
| ssize_t write(int fd, const void *buf, size_t count); | 通过文件描述符,从buf开始写count个字节到文件 |
| int fstat(int fd, struct stat *statbuf); | 返回文件的状态信息到statbuf结构体,通过结构体存储文件状态 |
| void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset); | 将磁盘文件映射到内存(虚拟内存),实际上会返回内存映射的起始地址 |
标准IO方式:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
/**
* argv[1]:新文件
* argv[2]:旧文件
**/
int main(int argc, char **argv)
{
int fd_old, fd_new;
char data[1024]; //1024个字节为一组
int len;
/*格式提醒*/
if(argc != 3) {
printf("Usage: %s <old-file> <new-file>\n", argv[0]);
return -1;
}
/* 1.打开文件 */
fd_old = open(argv[2], O_RDONLY);
if(fd_old == -1) {
printf("can not open file %s\n", argv[2]); //打开文件失败
return -1;
}
/* 2.创建新文件 */
fd_new = open(argv[1], O_CREAT | O_WRONLY | O_TRUNC, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
if(fd_new == -1) {
printf("can not creat file %s\n", argv[1]);
return -1;
}
/* 3.读取旧文件,写入新文件 */
while((len = read(fd_old, data, 1024)) > 0) {
if(write(fd_new, data, len) != len) {
printf("can not wite file %s\n", argv[2]);
return -1;
}
}
/* 4.关闭文件 */
close(fd_old);
close(fd_new);
return 0;
}
非通用IO(mmap):
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/mman.h>
int main(int argc, char **argv) {
int fd_old, fd_new;
struct stat stat;
char *ptr; //内存映射的起始地址
/* 1.判断指令 */
if(argc != 3) {
printf("Usage: %s <new-file> <old-file>\n", argv[0]);
return -1;
}
/* 2.打开旧文件 */
fd_old = open(argv[2], O_RDONLY);
if(fd_old == -1) {
printf("can not open %s\n", argv[2]);
return -1;
}
/* 3.获取文件长度 */
if(fstat(fd_old, &stat) == -1) { //获取文件信息
printf("can not get stat of %s\n", argv[2]);
return -1;
}
/* 4.映射旧文件 */
ptr = mmap(NULL, stat.st_size, PROT_READ, MAP_SHARED, fd_old, 0);
if(ptr == MAP_FAILED) {
printf("can not mmap file %s\n", argv[2]);
return -1;
}
/* 5.创建新文件 */
fd_new = open(argv[1], O_CREAT | O_TRUNC | O_WRONLY, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
if(fd_new == -1) {
printf("can not creat file %s\n", argv[2]);
return -1;
}
/* 6.写新文件 */
if(write(fd_new, ptr, stat.st_size) != stat.st_size) {
printf("can not write %s\n", argv[1]);
return -1;
}
/* 7.关闭文件 */
close(fd_new);
close(fd_old);
return 0;
}
嵌入式Linux—文件IO的更多相关文章
- 转:Linux 文件IO理解
源地址http://blog.csdn.net/lonelyrains/article/details/6604851 linux文件IO操作有两套大类的操作方式:不带缓存的文件IO操作,带缓存的文件 ...
- 转 漫谈linux文件IO
在Linux 开发中,有几个关系到性能的东西,技术人员非常关注:进程,CPU,MEM,网络IO,磁盘IO.本篇文件打算详细全面,深入浅出.剖析文件IO的细节.从多个角度探索如何提高IO性能.本文尽量用 ...
- 漫谈linux文件IO
在Linux 开发中,有几个关系到性能的东西,技术人员非常关注:进程,CPU,MEM,网络IO,磁盘IO.本篇文件打算详细全面,深入浅出.剖析文件IO的细节.从多个角度探索如何提高IO性能.本文尽量用 ...
- 【转】嵌入式Linux文件系统启动脚本及分析
原文网址:http://www.linuxidc.com/Linux/2011-03/33728.htm 在内核初始化完成后,嵌入式linux 文件系统的启动过程主要包含以下几个步骤: 1. 执行/s ...
- linux 文件IO
1.文件描述符 (1)文件描述符的本质是一个数字,这个数字本质上是进程表中文件描述符表的一个表项,进程通过文件描述符作为index去索引查表得到文件表指针,再间接访问得到这个文件对应的文件表.(2)文 ...
- <摘录>linux文件IO
这篇文章写的比较全面,也浅显易懂,备份下.转载自:http://blog.chinaunix.net/uid-27105712-id-3270102.html 在Linux 开发中,有几个关系到性能的 ...
- 2.Linux文件IO编程
2.1Linux文件IO概述 2.1.0POSIX规范 POSIX:(Portable Operating System Interface)可移植操作系统接口规范. 由IEEE制定,是为了提高UNI ...
- linux文件io与标准io
文件IO实际是API,Linux对文件操作主要流程为:打开(open),操作(write.read.lseek),关闭(close). 1.打开文件函数open(): 涉及的头文件: #includ ...
- Linux文件IO操作
来源:微信公众号「编程学习基地」 目录 文件操作 Linux文件类型 Linux文件权限 修改文件权限 Linux error 获取系统调用时的错误描述 打印错误信息 系统IO函数 open/clos ...
- linux文件IO操作篇 (一) 非缓冲文件
文件IO操作分为 2 种 非缓冲文件IO 和 缓冲文件IO 它们的接口区别是 非缓冲 open() close() read() write() 缓冲 fopen() fclose() fread() ...
随机推荐
- 实现将机器A上的程序包复制到机器B并更新的脚本
一.前言 之前有写过如何在单台服务器上执行脚本自动更新程序包,但平时测试过程中相信大部分公司都是需要测试人员在服务器A上进行功能测试,测试通过后再将程序包更新到服务器B上进行安全测试或者性能测试:今天 ...
- Go语言核心36讲05
你已经使用过Go语言编写了小命令(或者说微型程序)吗? 当你在编写"Hello, world"的时候,一个源码文件就足够了,虽然这种小玩意儿没什么用,最多能给你一点点莫名的成就感. ...
- java File类与文件输入/输出流:FileInputStream与FileOutputStream
java File类与文件输入/输出流 File类 File类是java.io包中唯一代表磁盘文件本身的类,该类主要用于文件和目录的创建.文件的查找和文件的删除等. 文件的创建与删除 1.File(S ...
- 研究光度立体法阶段性小结和优化(可20ms获取4个2500*2000灰度图的Normal Map)。
这个东西是我接触的第一个非2D方面的算法,到目前为止其实也没有完全搞定,不过可能短时间内也无法突破.先把能搞定的搞定吧. 这个东西也有一大堆参考资料,不过呢,搜来搜去其实也就那些同样的东西,个人觉得就 ...
- Spring03:案例转账功能(事务问题)、动态代理解决、AOP
今日内容--核心2AOP 完善Account案例 分析案例中的问题 回顾之前讲过的技术--动态代理 动态代理的另一种实现方式 解决案例中的问题 AOP的概念 Spring中的AOP相关术语 Sprin ...
- 【实时数仓】Day02-DWD、DIM层数据准备:各层职能、行为日志DWD层、业务日志DWD层及分流(Phoenix和HBASE)
一.需求分析及实现思路 1.分层需求 建立数仓目的:增加数据计算的复用性 可以从半成品继续加工而成 从kafka的ODS层(数据一开始就读到了kafka)读用户行为数据和业务数据,并写回到kafka的 ...
- 关于Mybatis-Plus中update()、updateById()方法的使用及null值的判断
使用场景说明: 在 Mybatis-Plus 的使用过程中,经常会遇对数据库更新的情况 更新常用方法:update().updateById() 问题:经常会遇见对 null 值的处理,对传入的实体参 ...
- java 如何正确使用接口返回对象Result
1. Result的使用 Result的使用,是java项目中开发接口的必备,它经常被我们用作接口的返回对象,方便前端或者其他程序的远程调用后处理业务.它一般包括以下几个属性: code:一般根据系统 ...
- VMware ESXi 8.0 SLIC & Unlocker 集成网卡驱动和 NVMe 驱动 (集成驱动版)
发布 ESXi 8.0 集成驱动版,在个人电脑上运行企业级工作负载 请访问原文链接:VMware ESXi 8.0 SLIC & Unlocker 集成网卡驱动和 NVMe 驱动 (集成驱动版 ...
- CPU 和 CPU Core 有啥区别?多核 CPU?多个 CPU?
CPU 全称 Central Processing Unit,中央处理器,计算机的大脑,长这个样子: CPU 通过一个插槽安装在主板上,这个插槽也叫做 CPU Socket,它长这个样子: 而我们说的 ...