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. Log4E

    工具地址:http://marketplace.eclipse.org/content/log4e Log4E插件能够帮助你在Java项目中轻松地创建记录器.它可以在以下几个任务中提供帮助:记录器声明 ...

  2. 学习笔记:暴力破解WIFI小软件

    小弟 自己的学习笔记,做练习的 ,缺陷还很多,做到无法解决速度问题就不想做下去了,如果要看的话 主要是思路问题,获取句柄,控制句柄而已,代码比较简单.大神勿喷啊 破解DEMO源码:http://dow ...

  3. iOS设计模式之生成器

    iOS设计模式之生成器 1.生成器模式的定义 (1): 将一个复杂的对象的构件与它的表示分离,使得相同的构建过程能够创建不同的表示 (2): 生成器模式除了客户之外还包括一个Director(指导者) ...

  4. 多平台响应键盘事件!(适用于Cocos2dx 3.0 alpha以上版本号)

    Hello everyone! For a week I've been looking on how to make a keyboard work! I managed to figure it ...

  5. Oracle基础学习1--Oracle安装

    安装过程较简单.按着步骤走就可以.这里须要提醒假设要使用PL/SQL来操作Oracle.那么最好安装32位Oracle程序.原因是网上说PL/SQL仅仅对32位Oracle进行支持,假设用64为Ora ...

  6. OpenOffice的安装与启动

    一.安装openOffice1.使用tar -xzvf OOo_3.2.0_LinuxIntel_install_wJRE_en-US.tar.gz解压缩后,会得到OOO320_m12_native_ ...

  7. Antelope与 Barracude MYSQL 文件格式

    作者:吴炳锡 来源:http://www.mysqlsupport.cn/ 联系方式: wubingxi#163.com 转载请注明作/译者和出处,并且不能用于商业用途,违者必究. Antelope是 ...

  8. LINUX 论文

    https://www.kernel.org/pub/linux/kernel/people/paulmck/

  9. systemtap 技巧系列 +GDB

    http://blog.csdn.net/wangzuxi/article/category/2647871

  10. 10465 - Homer Simpson 贪心

                                            Homer Simpson Time Limit: 3 seconds Memory Limit: 32 MB Home ...