1. 文件I/O

对于内核而言,所有打开的文件都通过文件描述符引用,内核不区分文本文件和二进制文件
open函数:O_RDONLY  O_WRONLY  O_RDWR
create函数:
close函数:关闭一个文件时还会释放该进程加在该文件上的所有记录锁
lseek函数:显式地为一个打开的文件设置其偏移量
每个打开的文件都有一个与其相关联的 "当前文件偏移量",用以度量从文件开始处计算的字节数,通常,读、写操作都从当前文件偏移量处开始,并使偏移量增加所读写的字节数
文件偏移量可以大于文件的当前长度,写该文件会在文件中形成一个空洞,文件中的空洞并不要求在磁盘上占用存储区。
 
read函数: 实际读到的字节数少于所要求读的字节数 的情况:
(1) 读普通文件时,在读要求字节数之前已达到了文件尾端,比如到达文件尾端之前还有30字节,而要求读100字节,那么下一次read会返回30字节,再下一次返回0
(2) 当从终端设备读时,通常一次最多读一行
(3) 当从网络套字节读时,网络中的缓冲机制可能造成返回值小于所要求读的字节数
(4) 当从管道或FIFO读时,例如 管道包含的字节数少于所需的数量,那么read将只返回实际可用的字节数
(5) 当某一信号造成中断,而已经读了部分数据量时
 
write函数:其返回值要与所写的字节数相同,否则表示出错
 

2.文件共享

内核使用三种数据结构来表示打开的文件
 
(1)每个进程在进程表中都有一个记录项,包含文件描述符表,有一个文件描述符标志和指向文件表项的指针
(2)内核为所有打开文件维护一张文件表,包含 文件状态标志、当前文件偏移量、指向该文件V节点表项的指针
(3)每个打开文件都有一个v节点结构,Linux使用inode节点结构,记录文件的元信息,对应于fstat函数
 
 
一个给定的文件只有一个v节点表项
每个进程都有它自己对该文件的当前偏移量
 

3. dup和dup2函数:复制一个现存的文件描述符

函数返回的新描述符与输入参数描述符共享同一个文件表项
 

4.fcntl函数

fcntl函数可以改变已打开的文件的性质
int fcntl(int fd, int cmd, ...)
fcntl函数有5中功能:
(1)复制一个现有的描述符 (cmd = F_DUPFD)
(2)获取/设置文件描述符标记 (cmd = F_GETFD, F_SETFD)
(3)获取/设置文件状态标志 (cmd = F_GETFL, F_SETFL)
(4)获取/设置异步I/O所有权 (cmd = F_GETOWN, F_SETOWN)
(5)获取/设置记录锁 (cmd = F_GETLK, F_SETLK, F_SETLKW)

APUE 学习笔记(二) 文件I/O的更多相关文章

  1. APUE学习笔记3_文件IO

    APUE学习笔记3_文件IO Unix中的文件IO函数主要包括以下几个:open().read().write().lseek().close()等.这类I/O函数也被称为不带缓冲的I/O,标准I/O ...

  2. linux学习笔记二-----文件权限管理

    一.分析文件权限(ln -s 文件名 快捷方式名 用来创建文件的快捷方式,下方ll查看信息时会在第一个字符处显示l) [hjp@bogon ~]$ ll total 4 drwxrwxr-x. 2 h ...

  3. APUE学习笔记3——文件和目录

    1 简介 之前学习了执行I/O操作的基本函数,主要是围绕普通文件I/O的打开.读或写.下面继续学习Unix文件系统的其他特征和文件的基本性质.我们将从stat函数开始,了解stat结构所代表的文件属性 ...

  4. Linux System Programming 学习笔记(二) 文件I/O

    1.每个Linux进程都有一个最大打开文件数,默认情况下,最大值是1024 文件描述符不仅可以引用普通文件,也可以引用套接字socket,目录,管道(everything is a file) 默认情 ...

  5. APUE 学习笔记(三) 文件和目录

    1. 文件类型 文件类型信息包含在 struct stat 里的 st_mode 成员 (1)普通文件,unix内核并不区分文本文件和二进制文件 (2)目录文件,这种文件包含了其他文件的名字以及指向这 ...

  6. APUE学习笔记2——文件I/O

    1 引言 本章首先讨论Unix系统中大多数文件I/O最常用的5个系统函数:open.read.write.lseek以及close. 本章所说明的函数又被成为不带缓冲的I/O,不带缓冲是指每个read ...

  7. python3.4学习笔记(二十六) Python 输出json到文件,让json.dumps输出中文 实例代码

    python3.4学习笔记(二十六) Python 输出json到文件,让json.dumps输出中文 实例代码 python的json.dumps方法默认会输出成这种格式"\u535a\u ...

  8. [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计

    源地址:http://bbs.9miao.com/thread-44603-1-1.html 在此补充一下Socket的验证机制:socket登陆验证.会采用session会话超时的机制做心跳接口验证 ...

  9. java之jvm学习笔记二(类装载器的体系结构)

    java的class只在需要的时候才内转载入内存,并由java虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式分为四种, 第一种,一次性解释代码,也就是当字节码转载到内存后,每次需要都会重新 ...

随机推荐

  1. 4G 内存 怎么只有2.99G可用

    32为系统只可以识别3.25G,而且有256M的内存被显卡共享显存了,所以只剩2,99G.

  2. 最大长度回文子串(Manacher's algorithm)

    输出最大长度的回文子串. string longestPalindrome(string s) { int id, mx, i, j, len, maxlen; vector<char> ...

  3. c++作业:求N的阶乘。

    N的阶乘就是n.(n-1)! 5的阶乘是什么?5*4*3*2*1 #include <iostream> using namespace std; int jiecheng(int num ...

  4. jquery源码学习第一天

    第一天认识了jquery的大体结构,总的大范围是 (function() { // 这里是封装的代码,包括了各种方法.工具 window.JQuery = JQuery window.$ = $; } ...

  5. C++ 学习笔记(三)string 类

    在C语言中如果想要使用字符串那么有两种方法: 1.定义char型数组:char[10]; 然后将每个字符填充到对应的位置. 优点:这种方式将字符串放在内存所以每个位置都可以修改. 缺点:赋值比较麻烦, ...

  6. 洛谷 P3328 【[SDOI2015]音质检测】

    这题我做的好麻烦啊... 一开始想分块来着,后来发现可以直接线段树 首先考虑一个性质,我们如果有数列的相邻两项f[i]和 f[i+1]那么用这两项向后推k项其线性表示系数一定(表示为f[i+k]=a∗ ...

  7. Spring Security 与 OAuth2(介绍)

    https://www.jianshu.com/p/68f22f9a00ee Spring Security 与 OAuth2(介绍) 林塬 2018.01.23 11:14* 字数 3097 阅读 ...

  8. PHP安装Xcache扩展

    简述 XCache 是一个又快又稳定的 ​PHP opcode 缓存器. 经过良好的测试并在大流量/高负载的生产机器上稳定运行. 经过(在 linux 上)测试并支持所有现行 ​PHP 分支的最新发布 ...

  9. OOP中常用到的函数

    学习地址: http://www.jikexueyuan.com/course/2420.html 判断类是否存在 class_exists() 得到类或者对象中的成员方法组成的数组 get_clas ...

  10. ProC第一弹

    编译pro*c 的makefile例子 原来只需在makefile中追加include $(ORACLE_HOME)/precomp/lib/env_precomp.mk,其他一切按照makefile ...