第3章文件I/O总结
1. open和create函数在fcntl.h中,close、lseek、read、write函数在unistd.h中
open函数通过进程有效用户ID判断读文件的权限
可以调用access函数判断进程的实际用户ID对文件的权限
2. create函数以只读方式打开文件,create(pathname,mode)相当于open(pathname,O_RDONLY|O_CREATE|O_TRUNC,mode)
O_RDONLY|O_CREATE|O_TRUNC导致只能创建文件,不能写文件,所以还是直接调用open比较方便
3. 有些类型的文件不能设置偏移量,如管道、FIFO、网络套接字,但是仍然可以对这类文件调用lseek,不过返回-1,errno被设置为ESPIPE
标准输入不能被设置偏移量,重定向到某些类型的文件后可以设置偏移量
int main()
{
if(lseek(STDIN_FILENO,0,SEEK_CUR)==-1)
perror("lseek error");
else
printf("lseek success\n");
}
直接运行:
./a
lseek error: Illegal seek
重定向到一般文件:
./a < a.c
lseek success
通过管道:
cat < a.c | ./a
lseek error: Illegal seek
4 od -c将以字符方式打印文件的实际内容
5 read和write函数的缓冲区定义为void*,一般会用char*类型的缓冲区,如果是其他类型的呢?
ISO C定义为void*,POSIX定义为char*
int buf[10];
int n = read(STDIN_FILENO,buf,10);
write(STDOUT_FILENO,buf,n);
仍然可以正常运行
read读到末端继续读返回0
6 内核用于表示打开的文件的数据结构
1)每个进程在进程表中的记录项包含一张打开文件描述符表,记录:
a)文件描述符
b)文件描述符标志(close_on_exec,即exec时文件描述符是否关闭,同一进程的两个指向同一文件的文件描述符可能具有不同的文件描述符标志,dup函数不会复制文件描述符标志)
c)指向文件表项的指针
2)文件表项(对同一文件,公共祖先进程之间共享,非公共祖先进程之间单独维护)包含:
a)文件打开方式
b)文件偏移量
c)指向v节点表项的指针
3)v节点结构:
v节点信息:文件类型和对此文件进行各种操作的函数的指针
i节点信息:文件所有者、文件长度、文件所在设备
三种数据结构形成了一种层级关系
打开文件描述符表记录的信息是公共祖先进程之间都可以不同的信息,所以每个进程单独维护
文件表项记录的是不同公共祖先进程之间可以不同的信息,所以公共祖先进程共享一个文件表项
v节点结构记录的是文件不针对进程而不同的信息,每个文件只有一个v节点结构,所有进程共用
dup函数为进程复制一个现存的文件描述符,进程将会有两个文件描述符指向同一个文件表项,但是进程的打开文件描述符表项中记录了文件描述符标志,这个标志不会被复制,即dup函数会清除文件描述符的close_on_exec位
打开/dev/fd/n相当于复制文件描述符n
7 设置偏移量与读写的原子操作
从6可以看出,不同进程之间可以设置不同的文件偏移量(记录在文件表中,不同进程单独维护,父子进程共享)
pread和pwrite在read和write的基础上添加一个参数,用于设置从某个偏移量开始读写:
ssize_t pread(int fd,const void *buf,size_t bnytes,off_t offset)
ssize_t pwrite(int fd,void *buf,size_t bnytes,off_t offset)
8 fcntl函数的cmd参数
F_DUPFD:复制文件描述符
F_GETFD/F_SETFD:获取/设置文件描述符标志(close_on_exec)
F_GETFL/F_SETFL:获取/设置文件状态标志(文件打开方式)
F_GETLK/F_SETLK/F_SETLKW:获取/设置记录锁
F_GETOWN/F_SETOWN:获取/设置异步I/O所有权,即获取/设置 接收SIGIO和SIGURG信号的进程或进程组ID
第3章文件I/O总结的更多相关文章
- perl5 第五章 文件读写
第五章 文件读写 by flamephoenix 一.打开.关闭文件二.读文件三.写文件四.判断文件状态五.命令行参数六.打开管道 一.打开.关闭文件 语法为open (filevar, file ...
- 零基础学Python--------第10章 文件及目录操作
第10章 文件及目录操作 10.1 基本文件操作 在Python中,内置了文件(File)对象.在使用文件对象时,首先需要通过内置的open() 方法创建一个文件对象,然后通过对象提供的方法进行一些基 ...
- 第四章 文件的基本管理和XFS文件系统备份恢复 随堂笔记
第四章 文件的基本管理和XFS文件系统备份恢复 本节所讲内容: 4.1 Linux系统目录结构和相对/绝对路径. 4.2 创建/复制/删除文件,rm -rf / 意外事故 4.3 查看文件内容的命令 ...
- 20190903 On Java8 第十七章 文件
第十七章 文件 在Java7中对 文件的操作 引入了巨大的改进.这些新元素被放在 java.nio.file 包下面,过去人们通常把nio中的n理解为new即新的io,现在更应该当成是non-bloc ...
- 第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 ...
- UNIX环境高级编程 第4章 文件和目录
第三章说明了关于文件I/O的基本函数,主要是针对普通regular类型文件.本章描述文件的属性,除了regular文件还有其他类型的文件. 函数stat.fstat.fstatat和lstat sta ...
- UNIX环境高级编程 第3章 文件I/O
前面两章说明了UNIX系统体系和标准及其实现,本章具体讨论UNIX系统I/O实现,包括打开文件.读文件.写文件等. UNIX系统中的大多数文件I/O只需要用到5个函数:open.read.write. ...
- <<Python基础教程>>学习笔记 | 第11章 | 文件和素材
打开文件 open(name[mode[,buffing]) name: 是强制选项,模式和缓冲是可选的 #假设文件不在.会报以下错误: >>> f = open(r'D:\text ...
- Linux Shell编程第5章——文件的排序、合并和分割
目录 sort命令 sort命令的基本用法 uniq命令 join命令 cut命令 paste命令 split命令 tr命令 tar命令 sort命令 sort命令是Linux系统一种排序工具,它将输 ...
- 第三章 文件 I/O
3.1 引言 先说明可用的文件 I/O 函数:open.read.write.close,然后说明不同缓冲区长度对read和write函数的影响. 本章所说的函数经常被称为不带缓冲的 I/O (unb ...
随机推荐
- HW4.43
import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...
- leetcode@ [51/52] N-Queens
https://leetcode.com/problems/n-queens/ class Solution { public: void dfs(vector<vector<string ...
- Error message “Assembly must be registered in isolation” when registering Plugins in Microsoft Dynamics CRM 2011 2013 解决办法
Error message “Assembly must be registered in isolation” when registering Plugins in Microsoft Dynam ...
- HDU 1102 Constructing Roads (最小生成树)
最小生成树模板(嗯……在kuangbin模板里面抄的……) 最小生成树(prim) /** Prim求MST * 耗费矩阵cost[][],标号从0开始,0~n-1 * 返回最小生成树的权值,返回-1 ...
- SSM框架整合基本操作
1.首先导入各种需要的配置包,在这里个人的习惯就是先导入mybatis相关包,然后通过编程软件集成一个spring3.0或者spring3.1进来并选择里面相应的包,这样就不需要我们自己去导入相应的s ...
- Hyper-V介绍
Hyer-v主机是高端虚拟主机用户的最佳选择.您不再受其他用户程序对您造成的影响,您将得到的是更加公平的资源分配,远远低于虚拟主机的故障率.Hyper-V的分区包含两种:父分区和客户分区.Hyper- ...
- 【28】避免返回handles指向对象内部成分
1.为什么? 很简单,你指向箱子里面的一个物品,使用这个物品.但是箱子不受你控制,箱子销毁了,里面的物品也会随之销毁.那么这种情况下,你指向的就是一堆垃圾,你还在使用这个物品,导致未定义的行为.
- Geogebra里给带有曲线和直线混合边界的封闭区域填充颜色
目的 用Geogebra绘制如图所看到的曲线,并填充如图边界的区域为实心: 用代码实现当然是能够的,可是,图形过于简单的时候用代码就不经济了.由于每个细小变动都还要调整改动代码并预览,非所见即所得.往 ...
- dtrace-oracle-vage :吕海波
http://blog.itpub.net/321157/cid--1-list-1/ http://www.hdb.com/timeline/velqk
- careercup-数学与概率
7.3 给定直角坐标系上的两条线,确定这两条线会不会相交. 解法: 此题有很多不确定的地方:两条线的格式是什么?两条线实为同一条怎么处理?这些含糊不清的地方最好跟面试官讨论一下. 下面将做出以下假设: ...