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. 【leetcode❤python】206. Reverse Linked List

    # Definition for singly-linked list.# class ListNode(object):#     def __init__(self, x):#         s ...

  2. 关于stl string find 容易犯的一个错误

    有时候经常会判断一个字符串a中是否有子字符串b,那么有人会调用 string::find这个函数  这个函数返回子字符串首次出现的位置,那么有人会这样写 string str1 = "&qu ...

  3. Latex中关于参考文献的一些经验

    又到了继春节后的又一个投稿高峰,在Latex中写参考文献时经常会出现这样那样的问题,而且出版社不同比如IEEE与Elaver,需要引入的包也有不同.在search解决方案时,发现一篇有用的博文,转载一 ...

  4. 使用entityframework操作sqlite数据库

    首先要安装好,所需要的类库,通过NuGet来处理 http://stackoverflow.com/questions/28507904/vs-2015-sqlite-data-provider 安装 ...

  5. Keepalive

    https://en.wikipedia.org/wiki/Keepalive Description A keepalive signal is often sent at predefined i ...

  6. Know How To Use Check Box Mapping Of Other Values Property In Oracle Forms

    Check Box Mapping of Other Values specifies how any fetched or assigned value that is not one of the ...

  7. centos 扩展root根分区的大小

    目标:将VolGroup-lv_home缩小到125G,并将剩余的空间添加给VolGroup-lv_root 1.首先查看磁盘使用情况[root@localhost ~]# df -h文件系统     ...

  8. [Gym]2008-2009 ACM-ICPC, NEERC, Moscow Subregional Contest

    比赛链接:http://codeforces.com/gym/100861 A模拟,注意两个特殊的缩写. #include <bits/stdc++.h> using namespace ...

  9. c# 基础之数组(包含三维数组)

    public enum ChessType { White = , None=, Black=, } class Program { static void Main(string[] args) { ...

  10. poj 2007 Scrambled Polygon(极角排序)

    http://poj.org/problem?id=2007 Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 6701   A ...