文件I/O
Linux顶层目录结构:
/ 根目录
├── bin 存放用户二进制文件
├── boot 存放内核引导配置文件
├── dev 存放设备文件
├── etc 存放系统配置文件
├── home 用户主目录
├── lib 动态共享库
├── lost+found 文件系统恢复时的恢复文件
├── media 可卸载存储介质挂载点
├── mnt 文件系统临时挂载点
├── opt 附加的应用程序包
├── proc 系统内存的映射目录,提供内核与进程信息
├── root root 用户主目录
├── sbin 存放系统二进制文件
├── srv 存放服务相关数据
├── sys sys 虚拟文件系统挂载点
├── tmp 存放临时文件
├── usr 存放用户应用程序
└── var 存放邮件、系统日志等变化文件
文件操作一般用到5个函数:
open、read、write、lseek、close
对于内核而言,所有打开的文件都通过文件描述符(非负整数)引用。当打开一个现有文件或创建一个新文件时,内核向进程返回一个文件描述符。
当读写一个文件时,用open或creat返回一个文件描述符标识该文件,将其所为参数传给read或write。
UNIX系统shell使用文件描述符0、1、2分别与进程的标准输入、标准输出、标准错误输出相关联。
在依从POSIX的应用程序中,幻数0、1、2应替换成符号常量STDIN_FILENO、STDOUT_FILENO、STDERR_FILENO,定义在头文件<unistd.h>中。
/dev/fd/的目录其目录项是名为0,1,2等文件,打开文件/dev/fd/n相当于复制描述符n。
fd = open("/dev/fd/0", mode)等效于fd = dup(0)
open函数

oflag常量包含:O_RDONLY、O_WRONLY、O_RDWR、O_APPEND、O_CREAT等。
lseek函数

设置当前文件偏移量。
whence值为:
read函数

因为read和write都在内核执行,所以称这些函数为不带缓冲的I/O函数。
每个打开的文件(或设备)都有一个v节点(v-node)结构。v节点包含了文件类型和对此文件进行操作的函数的指针。v节点包含了该文件的i节点(i-node索引节点)。
打开文件的内核数据结构 两个独立进程各自打开同一个文件


在完成每个write后,在文件表项中的当前文件偏移量即增加所写的字节数。
dup函数或fork后,父、子进程对于每一个打开文件描述符共享同一个文件表项。
原子操作用pread和pwrite

调用pread相当于顺序调用lseek和read,过程中无法终端其定位和读操作,不更新文件指针。
复制一个现存的文件描述符

sync、fsync和fdatasync函数


"r"(只读)
为输入打开一个文本文件,不存在则失败
"w"(只写)
为输出打开一个文本文件,不存在则新建,存在则删除后再新建
"a"(追加)
向文本文件尾部增加数据,不存在则创建,存在则追加
'rb"(只读)
为输入打开一个二进制文件,不存在则失败
"wb"(只写)
为输入打开一个二进制文件,不存在则新建,存在则删除后新建
"ab"(追加)
向二进制文件尾部增加数据,不存在则创建,存在则追加
"r+"(读写)
为读写打开一个文本文件,不存在则失败
"w+" (读写)
为读写建立一个新的文本文件,不存在则新建,存在则删除后新建
"a+"(读写)
为读写打开一个文本文件,不存在则创建,存在则追加
"rb+"(读写)
为读写打开一个二进制文件,不存在则失败
"wb+"(读写)
为读写建立一个新的二进制文件,不存在则新建,存在则删除后新建
"ab+"(读写)
为读写打开一个二进制文件,不存在则创建,存在则追加
文件有文件名与数据,这在 Linux 上被分成两个部分:用户数据 (user data) 与元数据 (metadata)。用户数据,即文件数据块 (data block),数据块是记录文件真实内容的地方;而元数据则是文件的附加属性,如文件大小、创建时间、所有者等信息。在 Linux 中,元数据中的 inode 号(inode 是文件元数据的一部分但其并不包含文件名,inode 号即索引节点号)才是文件的唯一标识而非文件名。文件名仅是为了方便人们的记忆和使用,系统或程序通过 inode 号寻找正确的文件数据块。在 Linux 系统中查看 inode 号可使用命令 stat 或 ls -i。
Linux链接分为硬链接和符号链接(软链接)。默认ln命令产生硬链接。链接为 Linux 系统解决了文件的共享使用,还带来了隐藏文件路径、增加权限安全及节省存储等好处。
硬连接指通过索引节点来进行连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在Linux中,多个文件名指向同一索引节点是存在的。一般这种连接就是硬连接。硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。其原因如上所述,因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。
另外一种连接称之为符号连接(Symbolic Link),也叫软连接。软链接文件有类似于Windows的快捷方式。它实际上是一个特殊的文件。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。
文件类型:
(1)普通文件
(2)目录文件
(3)块特殊文件:提供对设备(如磁盘)带缓冲的访问,每次访问以固定长度为单位进行。
(4)字符特殊文件:提供对设备不带缓冲的访问,每次访问长度可变。系统所有设备是字符特殊文件或块特殊文件。
(5)FIFO:用于进程间通信,又叫命名管道(named pipe)。
(6)套接字socket:用于进程间的网络通信,也可用于在一台宿主机上进程之间的非网络通信。
(7)符号链接:指向另一个文件
每次一个字符的I/O:
int getc(FILE *fp); // 可被实现为宏
int fgetc(FILE *fp);
int getchar(void); // 等价于getc(stdin)
若成功则返回下一个字符(unsigned char转换为int);到达结尾或出错返回EOF(负值,一般为-1)。
int putc(int c, FILE *fp);
int fputc(int c, FILE *fp);
int putchar(int c);
每次一行I/O:
char *fgets(char *buf, int n, FILE *fp);
char *gets(char *buf); // 容易造成缓冲区溢出;不将换行符存入缓冲区,会删除
若成功则返回buf;到达文件结尾或出错返回NULL。
int fputs(const char *str, FILE *fp); // null符终止字符串
int puts(const char *str);
若成功则返回非负值,出错返回EOF
二进制I/O:
size_t fread(void *buffer, size_t size, size_t count, FILE *stream); // 从文件流中读数据,最多读count个元素,每个元素size字节
size_t fwrite(const void *buffer, size_t size, size_t count, FILE *stream); // 向文件写入一个数据块,最多写count个元素,每个元素size字节
若成功返回实际读写的数据项个数,否则返回0。
定位流:
long ftell(FILE *fp); // 成功返回当前文件位置指示;出错返回-1L
int fseek(FILE *fp, long offset, int whence); // 成功返回0,出错返回非0值。 whence:SEEK_SET,SEEK_CUR,SEEK_END
void rewind(FILE *fp);
格式化I/O:
int printf(const char *format,...);
int fprintf(FILE *stream, const char *format, [argument]); // 两个函数返回值,成功返回输出字符数;出错返回负值
int sprintf(char *buffer, const char*format, [argument]...);
int snprintf(char *buffer, size_t size, const char*format,); // 两个函数返回值,成功返回存如数组的字符数;出错返回负值
文件I/O的更多相关文章
- Mapreduce的文件和hbase共同输入
Mapreduce的文件和hbase共同输入 package duogemap; import java.io.IOException; import org.apache.hadoop.co ...
- mapreduce多文件输出的两方法
mapreduce多文件输出的两方法 package duogemap; import java.io.IOException; import org.apache.hadoop.conf ...
- 01.SQLServer性能优化之----强大的文件组----分盘存储
汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 文章内容皆自己的理解,如有不足之处欢迎指正~谢谢 前天有学弟问逆天:“逆天,有没有一种方 ...
- SQL Server 大数据搬迁之文件组备份还原实战
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 解决方案(Solution) 搬迁步骤(Procedure) 搬迁脚本(SQL Codes) ...
- SQLSERVER将一个文件组的数据移动到另一个文件组
SQLSERVER将一个文件组的数据移动到另一个文件组 有经验的大侠可以直接忽视这篇文章~ 这个问题有经验的人都知道怎麽做,因为我们公司的数据量不大没有这个需求,也不知道怎麽做实验 今天求助了QQ群里 ...
- SQL Server中的高可用性(2)----文件与文件组
在谈到SQL Server的高可用性之前,我们首先要谈一谈单实例的高可用性.在单实例的高可用性中,不可忽略的就是文件和文件组的高可用性.SQL Server允许在某些文件损坏或离线的情况下,允 ...
- C# ini文件操作【源码下载】
介绍C#如何对ini文件进行读写操作,C#可以通过调用[kernel32.dll]文件中的 WritePrivateProfileString()和GetPrivateProfileString()函 ...
- 【小程序分享篇 一 】开发了个JAVA小程序, 用于清除内存卡或者U盘里的垃圾文件非常有用
有一种场景, 手机内存卡空间被用光了,但又不知道哪个文件占用了太大,一个个文件夹去找又太麻烦,所以我开发了个小程序把手机所有文件(包括路径下所有层次子文件夹下的文件)进行一个排序,这样你就可以找出哪个 ...
- 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新
上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...
- GreenDao 数据库:使用Raw文件夹下的数据库文件以及数据库升级
一.使用Raw文件夹下的数据库文件 在使用GreenDao框架时,数据库和数据表都是根据生成的框架代码来自动创建的,从生成的DaoMaster中的OpenHelper类可以看出: public sta ...
随机推荐
- [Cocoa]深入浅出 Cocoa 之 Core Data(1)- 框架详解
Core data 是 Cocoa 中处理数据,绑定数据的关键特性,其重要性不言而喻,但也比较复杂.Core Data 相关的类比较多,初学者往往不太容易弄懂.计划用三个教程来讲解这一部分: 框架详解 ...
- 【转载】nedmalloc结构分析
原文:nedmalloc结构分析 nedmalloc是一个跨平台的高性能多线程内存分配库,很多库都使用它,例如:OGRE.现在我们来看看nedmalloc的实现 (以WIN32部分为例) 位操作 ...
- libreoffice实现WORD文档转PDF文档
一.安装LibreOffice 官网:http://www.libreoffice.org/ 二.CentOS安装yum yum install libreoffice 三.执行转换命令 libreo ...
- Java float保留两位小数或多位小数
Java float保留两位小数或多位小数 方法1:用Math.round计算,这里返回的数字格式的. float price=89.89;int itemNum=3;float totalPr ...
- Codeforces Round #237 (Div. 2) A
链接:http://codeforces.com/contest/404/problem/A A. Valera and X time limit per test 1 second memory l ...
- ARC 下处理内存暴涨的一个解决办法
有一种情况: ; i < ; i++) { NSString *s = @"ABC"; s = [s lowercaseString]; s = [s stringByApp ...
- LINQ之路 3:C# 3.0的语言功能(下)
在LINQ介绍一篇中,我们已经看到了隐式类型变量var,扩展方法(Extension method)和Lambda表达式的身影.没错,他们正是LINQ技术的基石,是他们让LINQ的实现成为可能,并且简 ...
- 最牛叉的街机游戏合集 & 模拟器
亲爱的小伙伴们,是否还记得那年我们玩的疯狂的街机游戏吗,街机中心提供400多个街机游戏,让你爽到底. 例如:拳皇96,拳皇97,恐龙新世纪.名将.快打旋风.惩罚者.魂斗罗.超级玛丽.雪山兄弟.忍者神龟 ...
- CDN学习笔记二(技术详解)
一本好的入门书是带你进入陌生领域的明灯,<CDN技术详解>绝对是带你进入CDN行业的那盏最亮的明灯.因此,虽然只是纯粹的重点抄录,我也要把<CDN技术详解>的精华放上网.公诸同 ...
- CDN学习笔记一(CDN是什么?)
CDN是什么? 谈到CDN的作用,可以用8年买火车票的经历来形象比喻: 8年前,还没有火车票代售点一说,12306.cn更是无从说起.那时候火车票还只能在火车站的售票大厅购买,而我所住的小县城并不通火 ...