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. Dll封装dll,并且调用该封装的dll

    按照图1,2,3创建一个默认的(可以导出符号的dll项目) 默认创建的,很好地给我们说明了怎么导出 变量,导出函数,导出类 注意这里加入你要导出的函数的声明 WIN32PROJECT1_API int ...

  2. JPush删除别名及回调函数(SWIFT)

    JPush(极光)删除别名传空字符串即可,官方回调函数的例子为OC的.用SWIFT其实也差不多. //用户登出后删除别名 APService.setAlias("", callba ...

  3. Vue.js中用webpack合并打包多个组件并实现按需加载

    对于现在前端插件的频繁更新,所以多多少少要对组件化有点了解,下面这篇文章主要给大家介绍了在Vue.js中用webpack合并打包多个组件并实现按需加载的相关资料,需要的朋友可以参考下.   前言 随着 ...

  4. iOS8 对开发者来说意味着什么?

    今天凌晨,Apple WWDC2014 iOS8 正式推出! 也许,对于广大iOS用户来说,iOS8的创新并不是特别多. 但对于开发者来说,影响却将会是无比巨大的! 正如Apple官网上的广告:Hug ...

  5. scanf格式化中的\n

    如果一个scanf的格式串以\n结尾,那么在读取完后还会阻塞等待,比如: int a; scanf("%d\n", &a); 这种情况,输入一个数字然后敲下回车后,程序还是 ...

  6. javascript 处理鼠标右键事件

    使用右键事件 在需要右键的地方加上  onmousedown="if(event.button == 2) alert('点击右键了!');即可   不经意地被一位同事问起在javascri ...

  7. 利用git向github中推送文件

    /*游戏或者运动才能让我短暂的忘记心痛,现如今感觉学习比游戏和运动还重要——曾少锋*/ 如果对git不够熟悉的学者,可以参考:http://www.cnblogs.com/zengsf/p/75062 ...

  8. HihoCoder - 1781: Another Bubble Sort (冒泡排序&逆序对)

    Sample Input 3 9 8 7 5 1 9 2 6 4 3 1 2 3 4 5 6 7 8 9 9 8 7 5 1 9 2 6 4 3 1 2 5 4 3 6 7 8 9 9 8 7 5 1 ...

  9. Struts2访问ServletAPI的三种方式

    web应用中需要访问的ServletAPI,通常只有HttpServletRequest,HttpSession,ServletContext三个,这三个接口分别代表jsp内置对象中的request, ...

  10. 内核启动卡在 Starting kernel ...

    一.有时log是这样的 Card did not respond to voltage select! bytes read ms (39.8 MiB/s) bytes read ms (13.4 M ...