第3章文件I/O总结

时间:2022-09-13 13:56:37

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&sol;O(4)&lowbar;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&sol;O

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

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

    打开文件 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&sol;O

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

随机推荐

  1. curl操作CouchDB

    couchdb 服务器地址: 127.0.0.1 端口:5984 添加数据库 连接到couchdb curl -X GET http://127.0.0.1:5984 {"couchdb&q ...

  2. 【转】浅谈html5网页内嵌视频

    转自 http://www.pchou.info/web/2014/01/30/52ea01e13a7f1.html

  3. oracle 删除用户及相关表数据,释放磁盘空间

    来源于:http://www.itpub.net/thread-513609-1-1.html http://bbs.csdn.net/topics/330251089 http://blog.csd ...

  4. winfrom 水晶按钮

    闲来无事,从网上找了不少自定义控件,然后整理了一下,做了一个水晶按钮 /// <summary> /// 表示 Windows 的按钮控 /// </summary> [Des ...

  5. java request判断微信客户端访问

    微信客户端访问时候user-agent信息如下: Mozilla/5.0 (Linux; Android 5.0.1; M040 Build/LRX22C) AppleWebKit/537.36 (K ...

  6. 你好,C&plus;&plus;(28)用空间换时间 5&period;2 内联函数 5&period;3 重载函数

    5.2  内联函数 通过5.1节的学习我们知道,系统为了实现函数调用会做很多额外的幕后工作:保存现场.对参数进行赋值.恢复现场等等.如果函数在程序内被多次调用,且其本身比较短小,可以很快执行完毕,那么 ...

  7. SQL Server DML(SELECT)常见用法(二)

    1   引言 上篇讲到SQL Server中DML的基本使用方法,其中SELECT语句是最常用的语句,其功能强大,结构复杂,下面通过例子,具体介绍其使用方法. 2 SELECT查询语句 SELECT语 ...

  8. Android笔记&colon; 日期格式化

    下面的转换符来自Java,但是在android中同样可用.(以下表格内容来自互联网.) 常见日期格式化转换符 转换符 说 明 示 例 %te  一个月中的某一天(1-31)  2 %tb  指定语言环 ...

  9. Qt中的坐标系统

    Qt使用统一的坐标系统来定位窗口部件的位置和大小. 以屏幕的左上角为原点即(0, 0)点,从左向右为x轴正向,从上向下为y轴正向,这整个屏幕的坐标系统就用来定位顶层窗口: 此外,窗口内部也有自己的坐标 ...

  10. (转)winform之ListView

    一.ListView类 1.常用的基本属性: (1)FullRowSelect:设置是否行选择模式.(默认为false) 提示:只有在Details视图该属性才有意义. (2)GridLines:设置 ...