

嵌入式Linux—文件IO - Tayoou
source link: https://www.cnblogs.com/Tayoou/p/17110505.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

嵌入式Linux—文件IO - Tayoou - 博客园
在 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;
}
Recommend
-
6
大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是IAR内部C-SPY调试组件配套宏文件(.mac)用法。 痞子衡之前写过一篇 《JLink Script文...
-
4
uboot 从uboot到Linux 这里以uboot 2014年11月的主线代码为例分析从uboot到linux的全过程。之所以写这篇文章,是由于网上的资料多数都很陈旧,诸如start_armboot之类的函数在新的代码里根本找不到了。由于uboot支持的CPU以及Board非常的多...
-
2
多线程并发 在多核CPU中,利用多线程并发编程,可以更加充分地利用每个核的资源 在Java中,一个应用程序对应着一个JVM实例(也有地方称为JVM进程),如果程序没有主动创建线程,则只会创建一个主线程。...
-
6
Linux 系统由 Linux 内核、shell、文件系统和第三方应用软件组成。Linux 文件权限与属性是学习 Linux 系统的一个重要关卡,必须理解这个部分内容的概念。 一,文件类型 1.1,概述 ...
-
7
嵌入式Linux—Framebuffer应用编程
-
2
嵌入式Linux—输入子系统 常见的输入设备...
-
9
1、熟悉Linux的文件系统结构 Linux的文件系统结构其实是一个树形的分层组织结构,如下图:
-
8
全志V3S嵌入式驱动开发(制作根文件系统) ...
-
8
全志F1C200S嵌入式驱动开发(制作根文件系统)
-
5
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 编写上位机程序的时候,qt wizard一般...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK