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. java中的同步与异步

    在多线程的环境中,经常会碰到数据的共享问题,即当多个线程需要访问同一个资源时,它们需要以某种顺序来确保该资源在某--时刻只能被-一个线程使用,否则,程序的运行结果将会是不可预料的,在这种情况下就必须对 ...

  2. 说说TCP的三次握手

    在说这个问题之前,先说说IP协议和TCP协议 问题:IP协议能做什么?不能做什么? 我们都知道IP协议是无连接的通信协议,它不会占用两个正在通信的计算机的通信线路,这样就降低了IP对网络传输中的需求, ...

  3. NOIP模拟赛 双色球

    [题目描述] 机房来了新一届的学弟学妹,邪恶的chenzeyu97发现一位学弟与他同名,于是他当起了善良的学长233 “来来来,学弟,我考你道水题检验一下你的水平……” 一个栈内初始有n个红色和蓝色的 ...

  4. Spring Boot 应用 快速发布到linux服务器的脚本代码示例

    前提说明:spring boot 应用打包成jar包之后要部署到Linux服务器上面运行,我用的nohup java -jar 命令,但是代码更新之后重新部署的时候覆盖原来的项目,又要手动运行ps - ...

  5. How To Add Swap Space on Ubuntu 16.04

    Introduction One of the easiest way of increasing the responsiveness of your server and guarding aga ...

  6. python标准输入输出

    input() 读取键盘输入 input() 函数从标准输入读入一行文本,默认的标准输入是键盘. input 可以接收一个Python表达式作为输入,并将运算结果返回. print()和format( ...

  7. 让Python带你看一场唯美的横飘雪!

    “北国风光,千里冰封,万里雪飘”,这句诗描写了一句美丽肃静的风光图,恰逢昨天笔者这边也下了一场比较大的雪,要不今天就用Python带大家也来领略一次美丽的雪景? 开发环境 版本:Python3.6 系 ...

  8. Jack Straws POJ - 1127 (几何计算)

    Jack Straws Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 5428   Accepted: 2461 Descr ...

  9. zoj 4056

    At 0 second, the LED light is initially off. After BaoBao presses the button 2 times, the LED light ...

  10. linux学习-CentOS 7 环境下大量建置账号的方法

    一些账号相关的检查工具 pwck pwck 这个指令在检查 /etc/passwd 这个账号配置文件内的信息,与实际的家目录是否存在等信息, 还可以比对 /etc/passwd /etc/shadow ...