第3章 文件I/O(3)_内核数据结构、原子操作
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)_内核数据结构、原子操作的更多相关文章
- perl5 第五章 文件读写
第五章 文件读写 by flamephoenix 一.打开.关闭文件二.读文件三.写文件四.判断文件状态五.命令行参数六.打开管道 一.打开.关闭文件 语法为open (filevar, file ...
- 零基础学Python--------第10章 文件及目录操作
第10章 文件及目录操作 10.1 基本文件操作 在Python中,内置了文件(File)对象.在使用文件对象时,首先需要通过内置的open() 方法创建一个文件对象,然后通过对象提供的方法进行一些基 ...
- 第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 ...
- 第三章 文件 I/O
3.1 引言 先说明可用的文件 I/O 函数:open.read.write.close,然后说明不同缓冲区长度对read和write函数的影响. 本章所说的函数经常被称为不带缓冲的 I/O (unb ...
- 《Unix环境高级编程》读书笔记 第3章-文件I/O
1. 引言 Unix系统的大多数文件I/O只需用到5个函数:open.read.write.lseek以及close 本章描述的函数经常被称为不带缓冲的I/O.术语不带缓冲指的是在用户的进程中对其不会 ...
- 第四章 文件的基本管理和XFS文件系统备份恢复 随堂笔记
第四章 文件的基本管理和XFS文件系统备份恢复 本节所讲内容: 4.1 Linux系统目录结构和相对/绝对路径. 4.2 创建/复制/删除文件,rm -rf / 意外事故 4.3 查看文件内容的命令 ...
- 20190903 On Java8 第十七章 文件
第十七章 文件 在Java7中对 文件的操作 引入了巨大的改进.这些新元素被放在 java.nio.file 包下面,过去人们通常把nio中的n理解为new即新的io,现在更应该当成是non-bloc ...
- linux文件内容列传行_行转列
================ 文件内容列传行_行转列 ================ 一.列转行 1.编辑测试文件 vi log.txt 16:23:00 8.2% 1773620k 16:2 ...
- 第七章 文件与I/O(4)
文件共享 打开文件内核数据结构 一个进程两次打开同一个文件 一个进程能打开1024个文件描述符,没打开一个文件,内核会生成一个文件表,文件表中的v节点指针指向v节点表,v节点部分信息就是stat函数返 ...
随机推荐
- C# 历史曲线控件 基于时间的曲线控件 可交互的高级曲线控件 HslControls曲线控件使用教程
本篇博客主要对 HslControls 中的曲线控件做一个详细的教程说明,大家可以根据下面的教程开发出高质量的曲线控件 Prepare 先从nuget下载到组件,然后就可以使用组件里的各种组件信息了. ...
- HTTPS网站的内幕
什么是HTTPS网站? HTTPS可以理解为HTTP+TLS,HTTP是互联网中使用最为广泛的协议,目前大部分的WEB应用和网站都是使用HTTP协议传输. 那网站为什么要实现HTTPS? 一言概之,为 ...
- 杭电 KazaQ's Socks
KazaQ wears socks everyday. At the beginning, he has n pairs of socks numbered from 1 to n in his cl ...
- 不缓存AJAX
最好的办法是:写上这段代码 $.ajaxSetup({cache:false}); 这样页面中,所有的ajax请求,都执行这个,就不必改已经完成的N个接口 最初接受的办法是:在url后面添加当前时间 ...
- Linux设备树使用(二)
一.设备树与驱动的匹配1.设备树会被/scripts中的dtc可执行程序编译成二进制.dtb文件,之前设备树中的节点信息会以单链表的形式存储在这个.dtb文件中:驱动与设备树中compatible属性 ...
- hibernate 1-1(具体解释)
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/qilixiang012/article/details/27870343 域模型 关系数据模型: 依 ...
- 【转】每天一个linux命令(46):vmstat命令
原文网址:http://www.cnblogs.com/peida/archive/2012/12/25/2833108.html vmstat是Virtual Meomory Statistics( ...
- WeakHashMap 理解
WeakHashMap 通过 expungeStaleEntries 这个函数的来实现:移除其内部不用的条目,从而达到自动释放内存的目的. 基本上只要对 WeakHashMap 的内容进行访问就会调用 ...
- 二、Jmeter录制脚本过程及Could not create script recorder报错、您的连接不是私密连接报错
两个报错:Could not create script recorder报错和您的连接不是私密连接报错 1.录制过程 * 打开jmeter * 点击Templated,选择Recoding模版 * ...
- Tomcat 自动化部署
Tomcat 自动化部署脚本 使用方法: ./autodeploy.sh test 其中autodeploy.sh 为脚本的文件名, test为war的文件名. #!/bin/sh now=`date ...