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总结的更多相关文章

  1. perl5 第五章 文件读写

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

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

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

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

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

  4. 20190903 On Java8 第十七章 文件

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

  5. 第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 ...

  6. UNIX环境高级编程 第4章 文件和目录

    第三章说明了关于文件I/O的基本函数,主要是针对普通regular类型文件.本章描述文件的属性,除了regular文件还有其他类型的文件. 函数stat.fstat.fstatat和lstat sta ...

  7. UNIX环境高级编程 第3章 文件I/O

    前面两章说明了UNIX系统体系和标准及其实现,本章具体讨论UNIX系统I/O实现,包括打开文件.读文件.写文件等. UNIX系统中的大多数文件I/O只需要用到5个函数:open.read.write. ...

  8. &lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第11章 | 文件和素材

    打开文件 open(name[mode[,buffing]) name: 是强制选项,模式和缓冲是可选的 #假设文件不在.会报以下错误: >>> f = open(r'D:\text ...

  9. Linux Shell编程第5章——文件的排序、合并和分割

    目录 sort命令 sort命令的基本用法 uniq命令 join命令 cut命令 paste命令 split命令 tr命令 tar命令 sort命令 sort命令是Linux系统一种排序工具,它将输 ...

  10. 第三章 文件 I/O

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

随机推荐

  1. Log Parser 微软强大的日志分析工具

    Log Parser(微软网站下载)是微软公司出品的日志分析工具,它功能强大,使用简单,可以分析基于文本的日志文件.XML 文件.CSV(逗号分隔符)文件,以及操作系统的事件日志.注册表.文件系统.A ...

  2. 如果iis的配置文件 applicationHost.config坏掉了, 会在 C:\inetpub\history\ 中存储历史备份。复制过去还原就可以了-摘自网络

    You will usually get the error ‘Configuration file is not well-formed XML’ ‘C:\Windows\system32\inet ...

  3. 扫描线专题 hdu1255

    hdu1255 求覆盖至少两次的面积,和直接求覆盖面积比,就是保证cover>1就可以了. 没有进行lazy操作,因为每一次更新伴随着询问,感觉没有必要.982MS水过. #include &l ...

  4. 理解screenX clientX pageX概念

    先了解screenX,clientX,pageX概念 screenX: 鼠标位置相对于用户屏幕水平偏移量,而screenY就是垂直方向的,此时的参照点也就是原点是屏幕的左上角. clientX: 跟s ...

  5. JavaWeb国际化

    软件的国际化: 软件在不同的地方,适应不同的风格: 中国: 显示中文,以及服务符合中国习惯的文本字符串! 美国: 显示英文,以及服务符合他国习惯的文本字符串! 这种软件,就叫国际化的软件! 如何做到国 ...

  6. Entity Framework 教程(转)

    预备知识    2 LINQ技术    2 LINQ技术的基础 - C#3.0    2 自动属性    2 隐式类型    2 对象初始化器与集合初始化器    3 匿名类    3 扩展方法    ...

  7. cocos2d-x jsb + cocosbuider 适配iphone5 尺寸

    最简单的适配iphone5的方案,应该算是直接用一块图片补上多出来的区域了: 1:Iphone5分辨率为 1136* 640 , 需要在cocosbuilder中将ccb修改为对应的尺寸: Docum ...

  8. URI URL

    http://www.cnblogs.com/ACFLOOD/p/5533022.html

  9. List IEnumerable

    //按部门汇总            IEnumerable<WeekReportWithDepartmentInfo> report = summary            .Grou ...

  10. Android5.0之TextInputLayout、FloatingActionButton的使用

    TextInputLayout和FloatingActionButton都属于MD风格的控件,比起普通的EditText和Button.ImageButton,TextInputLayout和Floa ...