第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 ...
随机推荐
- POJ1155 - TELE(树形DP)
题目大意 电视台要直播一场比赛,电视网络刚好形成了一棵树,其中有M个为客户端,其他的为中转站,其中中转站与中转站以及中转站与客户端之间连接都需要一定费用,每个客户i愿意支付pay[i]元钱,问电视台在 ...
- android onTouch()与onTouchEvent()的区别
1.onTouch方法: onTouch方法是View的 OnTouchListener借口中定义的方法.当一个View绑定了OnTouchLister后,当有touch事件触发时,就会调用onTou ...
- sql server smo
在SQL Server2005以前的版本中,SQL分布式管理对象(SQL-DMO)为我们提供了非常有效的方法来通过编程的方式管理SQL Server.SQL-DMO支持基于COM的接口,开发人员可以通 ...
- 在SCVMM2012R2中删除失去联系的VM GateWay
当VM Gateway失去联系,无法使用,直接删除GW,或者在VM Network中删除GW连接,均会出现如下错误提示: 错误(21426)对配置提供程序 4ee559f1-f479-480c-945 ...
- Copy-VMFile
将文件移到或移出虚拟机可能会产生问题.首先,你需要安装集成服务,打开文件共享.这只需要一个简单的PowerShell命令:Enable-VMIntegrationService.但是你必须登录到虚拟机 ...
- ZooKeeper场景实践:(6)集群监控和Master选举
1. 集群机器监控 这通经常使用于那种对集群中机器状态,机器在线率有较高要求的场景,可以高速对集群中机器变化作出响应.这种场景中,往往有一个监控系统,实时检測集群机器是否存活. 利用ZooKeeper ...
- 走进C++程序世界-----继承和派生(2)
覆盖基类的函数 覆盖基类函数顾名思义就是在派生类中对基类的函数进行的重新定义.这里将会讲到下面的2个知识点: 1.隐藏基类的方法 2.调用基类的方法(隐式和显示调用基类的方法) /* *derive2 ...
- Dom4j写XML
package com; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.I ...
- Android开发之位置定位详解与实例解析(GPS定位、Google网络定位,BaiduLBS(SDK)定位)
在android开发中地图和定位是很多软件不可或缺的内容,这些特色功能也给人们带来了很多方便.定位一般分为三种发方案:即GPS定位.Google网络定位以及基站定位 最简单的手机定位方式当然是通过GP ...
- Android开发之从网络URL上下载JSON数据
网络下载拉取数据中,json数据是一种格式化的xml数据,非常轻量方便,效率高,体验好等优点,下面就android中如何从给定的url下载json数据给予解析: 主要使用http请求方法,并用到Htt ...