3. 文件I/O的内核数据结构

(1) 内核数据结构表

数据结构

主要成员

文件描述符表

①文件描述符标志

②文件表项指针

文件表项

①文件状态标志(读、写、追加、同步和非阻塞等状态标志)

②当前文件偏移量

③i节点表项指针

④引用计数器

i节点

①文件类型和对该文件的操作函数指针

②当前文件长度

③文件所有者

④文件所在设备、文件访问权限

⑤指向文件数据在磁盘块上所在位置的指针等。

(2)3张表的关系

4. 文件的原子操作

(1)文件追加

  ①打开文件时使用O_APPEND标志,进程对文件偏移量调整和数据追加成为原子操作相当于write函数将以下3个操作作为一个原子操作,不可被打断。

    A.从i节点读取文件长度作为当前偏移量

    B.往文件中写入数据

    C.修改i节点中文件长度信息等

  ②内核每次对文件写之前,都将进程的当前偏移量设置为该文件的尾端。这样不再需要lseek来调整偏移量。

(2)文件创建

  对open函数的O_CREAT和O_EXCL的使用,而该文件存,open将失败,否则创建该文件,并且使得文件是否存在的判定和创建过程成为原子操作

【编程实验】原子操作

//file_append.c

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h> //exit
#include <string.h> //strlen
#include <fcntl.h> //O_WRONLY //为了演示文件定位与追加数据是否被打断,需要打开该程序的两个进程,分别按
//文件的格式在命令行中输入相应的参数。 int main(int argc, char* argv[]){
if( argc < ){
printf("usage: %s content destfile\n", argv[]);
exit();
} //注意,Linux默认下文件锁是建议锁(具体见后面“文件锁”方面的内容),所以
//尽管加了O_WRONLY,但不同进程仍然可以同时修改这个文件)
//int fd = open(argv[2], O_WRONLY); //这种方式的定位与追加不是原子操作的
int fd = open(argv[], O_WRONLY | O_APPEND); //定位与追加是原子操作 if(fd < ){
perror("open error");
exit();
} //定位到文件尾部(只使用O_WRONLY选项时,需手动定位到文件末尾
//lseek(fd, 0L, SEEK_END); sleep(); //为了把定位与写入过程隔开,以便演示多进程同时写入同一文件
//时会出现后启动进程格覆盖之前进程写过的内容。 //往文件尾部追加内容
size_t size = strlen(argv[])*sizeof(char);
if(write(fd, argv[], size)!=size){
perror("write error");
exit();
} close(fd); return ;
}

第3章 文件I/O(3)_内核数据结构、原子操作的更多相关文章

  1. perl5 第五章 文件读写

    第五章 文件读写 by flamephoenix 一.打开.关闭文件二.读文件三.写文件四.判断文件状态五.命令行参数六.打开管道 一.打开.关闭文件   语法为open (filevar, file ...

  2. 零基础学Python--------第10章 文件及目录操作

    第10章 文件及目录操作 10.1 基本文件操作 在Python中,内置了文件(File)对象.在使用文件对象时,首先需要通过内置的open() 方法创建一个文件对象,然后通过对象提供的方法进行一些基 ...

  3. 第3章 文件I/O(4)_dup、dup2、fcntl和ioctl函数

    5. 其它I/O系统调用 (1)dup和dup2函数 头文件 #include<unistd.h> 函数 int dup(int oldfd); int dup2(int oldfd, i ...

  4. 第三章 文件 I/O

    3.1 引言 先说明可用的文件 I/O 函数:open.read.write.close,然后说明不同缓冲区长度对read和write函数的影响. 本章所说的函数经常被称为不带缓冲的 I/O (unb ...

  5. 《Unix环境高级编程》读书笔记 第3章-文件I/O

    1. 引言 Unix系统的大多数文件I/O只需用到5个函数:open.read.write.lseek以及close 本章描述的函数经常被称为不带缓冲的I/O.术语不带缓冲指的是在用户的进程中对其不会 ...

  6. 第四章 文件的基本管理和XFS文件系统备份恢复 随堂笔记

    第四章 文件的基本管理和XFS文件系统备份恢复 本节所讲内容: 4.1 Linux系统目录结构和相对/绝对路径. 4.2 创建/复制/删除文件,rm -rf / 意外事故 4.3 查看文件内容的命令 ...

  7. 20190903 On Java8 第十七章 文件

    第十七章 文件 在Java7中对 文件的操作 引入了巨大的改进.这些新元素被放在 java.nio.file 包下面,过去人们通常把nio中的n理解为new即新的io,现在更应该当成是non-bloc ...

  8. linux文件内容列传行_行转列

    ================ 文件内容列传行_行转列  ================ 一.列转行 1.编辑测试文件 vi log.txt 16:23:00 8.2% 1773620k 16:2 ...

  9. 第七章 文件与I/O(4)

    文件共享 打开文件内核数据结构 一个进程两次打开同一个文件 一个进程能打开1024个文件描述符,没打开一个文件,内核会生成一个文件表,文件表中的v节点指针指向v节点表,v节点部分信息就是stat函数返 ...

随机推荐

  1. 转:ios导航栏设置

    原帖:http://www.cocoachina.com/industry/20131104/7287.html 本文提供的代码需要用Xcode 5来执行.如果你还在使用老版本的Xcode,那么在运行 ...

  2. Windows 下python的tab自动补全

    方法一:安装一个ipython就OK啦,而且关键字还能高亮显示呢 一.打开cmd,输入pip3 install ipython联网安装 二.安装成功后,cmd里运行ipython,成功啦. 方法二:写 ...

  3. jvm 方法区

    方法区在一个jvm实例的内部,类型信息被存储在一个称为方法区的内存逻辑区中.类型信息是由类加载器在类加载时从类文件中提取出来的.类(静态)变量也存储在方法区中. jvm实现的设计者决定了类型信息的内部 ...

  4. show point on image

    show point on image... for ( int i = 0; i < probp.size(); i++ ) { cv::Point pt = probp[i]; Distan ...

  5. IO练习--按字节截取字符串

    * 在Java中字符串“abcd”和字符串“ab你好”都是4个字符, * 但是字节数不同,因为GBK中一个汉字占两个字节 * 定义一个方法用来按字节数截取字符串. * 如:对于“ab你好”,取3个字节 ...

  6. Pr学习日记

    1.http://tieba.baidu.com/p/4102775256   2.素才,编辑制作视频,视频输出    3. 启用新建保存:     启用:双击    新建项目:名称(第一节课),位置 ...

  7. hdu2069-2071

    hdu2069 选取硬币组成定值,暴力 #include<stdio.h> ]={,,,,,}; int main(){ int n; while(scanf("%d" ...

  8. ballerina 学习 三十 扩展开发(一)

    ballerina 主要是分为两大类 基于ballerina 语言开发的,一般是客户端的connector 使用java语言开发的(类似的基于jvm的都可以),一般是注解以及进行构件生成 baller ...

  9. yugabyte 集成JanusGraph测试

    yugabyte 集成图数据库JanusGraph,原理比较简单就是yugabyte 内置Cassandra,配置好JanusGraph 的访问就可以了. 使用docker 模式部署 创建yugaby ...

  10. Linux下载

    免费下载地址在 http://linux.linuxidc.com/ 用户名与密码都是www.linuxidc.com 下载方法见 http://www.linuxidc.com/Linux/2013 ...