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值为:

SEEK_SET  以文件开头为锁定的起始位置。0
SEEK_CUR 以目前文件读写位置为锁定的起始位置。1
SEEK_END 以文件结尾为锁定的起始位置。2

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的更多相关文章

  1. Mapreduce的文件和hbase共同输入

    Mapreduce的文件和hbase共同输入 package duogemap;   import java.io.IOException;   import org.apache.hadoop.co ...

  2. mapreduce多文件输出的两方法

    mapreduce多文件输出的两方法   package duogemap;   import java.io.IOException;   import org.apache.hadoop.conf ...

  3. 01.SQLServer性能优化之----强大的文件组----分盘存储

    汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 文章内容皆自己的理解,如有不足之处欢迎指正~谢谢 前天有学弟问逆天:“逆天,有没有一种方 ...

  4. SQL Server 大数据搬迁之文件组备份还原实战

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 解决方案(Solution) 搬迁步骤(Procedure) 搬迁脚本(SQL Codes) ...

  5. SQLSERVER将一个文件组的数据移动到另一个文件组

    SQLSERVER将一个文件组的数据移动到另一个文件组 有经验的大侠可以直接忽视这篇文章~ 这个问题有经验的人都知道怎麽做,因为我们公司的数据量不大没有这个需求,也不知道怎麽做实验 今天求助了QQ群里 ...

  6. SQL Server中的高可用性(2)----文件与文件组

        在谈到SQL Server的高可用性之前,我们首先要谈一谈单实例的高可用性.在单实例的高可用性中,不可忽略的就是文件和文件组的高可用性.SQL Server允许在某些文件损坏或离线的情况下,允 ...

  7. C# ini文件操作【源码下载】

    介绍C#如何对ini文件进行读写操作,C#可以通过调用[kernel32.dll]文件中的 WritePrivateProfileString()和GetPrivateProfileString()函 ...

  8. 【小程序分享篇 一 】开发了个JAVA小程序, 用于清除内存卡或者U盘里的垃圾文件非常有用

    有一种场景, 手机内存卡空间被用光了,但又不知道哪个文件占用了太大,一个个文件夹去找又太麻烦,所以我开发了个小程序把手机所有文件(包括路径下所有层次子文件夹下的文件)进行一个排序,这样你就可以找出哪个 ...

  9. 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新

    上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...

  10. GreenDao 数据库:使用Raw文件夹下的数据库文件以及数据库升级

    一.使用Raw文件夹下的数据库文件 在使用GreenDao框架时,数据库和数据表都是根据生成的框架代码来自动创建的,从生成的DaoMaster中的OpenHelper类可以看出: public sta ...

随机推荐

  1. [Cocoa]深入浅出 Cocoa 之 Core Data(1)- 框架详解

    Core data 是 Cocoa 中处理数据,绑定数据的关键特性,其重要性不言而喻,但也比较复杂.Core Data 相关的类比较多,初学者往往不太容易弄懂.计划用三个教程来讲解这一部分: 框架详解 ...

  2. 【转载】nedmalloc结构分析

    原文:nedmalloc结构分析 nedmalloc是一个跨平台的高性能多线程内存分配库,很多库都使用它,例如:OGRE.现在我们来看看nedmalloc的实现 (以WIN32部分为例)    位操作 ...

  3. libreoffice实现WORD文档转PDF文档

    一.安装LibreOffice 官网:http://www.libreoffice.org/ 二.CentOS安装yum yum install libreoffice 三.执行转换命令 libreo ...

  4. Java float保留两位小数或多位小数

    Java float保留两位小数或多位小数 方法1:用Math.round计算,这里返回的数字格式的.    float price=89.89;int itemNum=3;float totalPr ...

  5. 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 ...

  6. ARC 下处理内存暴涨的一个解决办法

    有一种情况: ; i < ; i++) { NSString *s = @"ABC"; s = [s lowercaseString]; s = [s stringByApp ...

  7. LINQ之路 3:C# 3.0的语言功能(下)

    在LINQ介绍一篇中,我们已经看到了隐式类型变量var,扩展方法(Extension method)和Lambda表达式的身影.没错,他们正是LINQ技术的基石,是他们让LINQ的实现成为可能,并且简 ...

  8. 最牛叉的街机游戏合集 & 模拟器

    亲爱的小伙伴们,是否还记得那年我们玩的疯狂的街机游戏吗,街机中心提供400多个街机游戏,让你爽到底. 例如:拳皇96,拳皇97,恐龙新世纪.名将.快打旋风.惩罚者.魂斗罗.超级玛丽.雪山兄弟.忍者神龟 ...

  9. CDN学习笔记二(技术详解)

    一本好的入门书是带你进入陌生领域的明灯,<CDN技术详解>绝对是带你进入CDN行业的那盏最亮的明灯.因此,虽然只是纯粹的重点抄录,我也要把<CDN技术详解>的精华放上网.公诸同 ...

  10. CDN学习笔记一(CDN是什么?)

    CDN是什么? 谈到CDN的作用,可以用8年买火车票的经历来形象比喻: 8年前,还没有火车票代售点一说,12306.cn更是无从说起.那时候火车票还只能在火车站的售票大厅购买,而我所住的小县城并不通火 ...