第二章 文件I/O

1、文件描述符
  对于内核而言,所有打开的文件都通过文件描述符引用,文件描述符是一个非负整数。
  Unix shell使用文件描述符0表示标准输入,1表示标准输出,2表示标准出错输出,为了避免在代码中出现魔数,在<unixtd.h>头文件中,1,2,3替换为符号常量STDIN_FILENO,STDOUT_FILENO,STDERR_FILENO,文件描述符的变化范围是0~OPEN_MAX。

2、open函数
原型:#include<fcntl.h>
    int open(const char *pathname, int oflag, ...)   /*仅当创建新文件时才使用第三个参数*/
 pathname是要打开或创建的文件名字,oflag是参数选项,可选值有:O_RDONLY(只读打开,0),O_WRONLY(只写打开,1),O_RDWR(读写打开,2),这些常量定义在<fcntl.h>头文件中,这3个常量必须指定一个且只能指定一个。下列常量是可选的,O_APPEND(写时追加尾部),O_CREAT(若不存在则创建,需指定第三个参数说明文件访问权限),O_EXCL(若和O_CREAT一起使用,当要创建的文件已经存在就会失败),O_TRUNC(文件截短为0,需文件存在,且为只写或读写打开),O_NOCTTY(pathname指向终端设备,不将它作为控制终端),O_NONBLOCK(pathname指向FIFO、块或字符特殊文件时,设置非阻塞模式)、O_DSYNC(使每次write等待物理IO操作完成,不包括文件属性IO的更新),O_RSYNC(读操作等待写操作完成)、O_SYNC(每次write等待物理IO操作完成,包括文件属性IO的更新)     注意:Linux将O_DSYNC、O_RSYNC、O_SYNC等同与O_SYNC(其实这些知识点应该是自己做实验发现,而不是等着书本来教你~~)              返回最小的未使用描述符数值。

3、creat函数
原型:#include<fcntl.h>
    int create(const char* pathname, mode_t mode);等效于open(pathname, O_WRONLY|O_CREAT|O_TRUNC, mode),可以完全用open函数取代creat函数

4、close函数
原型:#include<unistd.h>
    int close(int filedes);关闭一个文件时还会释放该进程加在该文件上的记录锁。

5、lseek函数
作用:显示的为一个文件设置偏移量
原型:#include<unistd.h>
     off_t lseek(int fileds, off_t offset, int whence);
  对offset的解释与whence的值有关,当whence为SEEK_SET,则该文件的偏移量为距文件开头处offset字节处; 当whence为SEEK_CUR,则该文件的偏移量为当前值加上offset,offset可以为正或负;  当whence为SEEK_END,则文件偏移量为文件长度加offset,offset可以为正或负。      返回新的文件偏移量。
应用:1、确定打开文件当前偏移量:off_t currpos;       currpos = lseek(fd, 0, SEEK_CUR);
     2、确定所涉及的文件是否可以设置偏移量。如果文件描述符引用的是一个管道、FIFO或网络套接字,则lseek返回-1,并将errno设置为ESPIPE。
     3、lseek允许定位到文件长度之后,这样就会造成文件空洞。使用od(1)命令可以观察文件的实际内容。

6、read函数
原型:#include<unistd.h>
     ssize_t read(int filedes, void *buf, size_t nbytes);   成功返回读到的字节数,到文件尾返回0,失败返回-1

7、write函数
原型:#include<unistd.h>
     ssize write(int filedes, const void* buf, size_t nbytes);   成功返回已写字节数,若出错返回-1

8、关于文件共享
 内核使用3种数据结构表示打开的文件:(1)每个进程都有一个打开文件描述符表;(2)内核为所有打开文件维持一张文件表(每个表项包括文件状态标志,当前文件偏移量,指向该节点v节点指针),(3)一个v节点结构包括文件类型及i节点信息(如文件所有者、文件长度、文件所在设备等等)                 注:linux没有v节点,使用的就是i节点

9、使用原子操作的场合:1)、lseek+write -> 使用O_APPEND标志 或 使用pread函数和pwrite函数

10、dup和dup2函数:用于复制一个现存的文件描述符
原型:#include<unistd.h>    int dup(int filedes);      int dup2(int filedes1, int filedes2);    dup返回当前可用的最小文件描述符,dup2可用filedes2指定文件描述符,如果filedes已经打开则先将其关闭,这些函数返回的新文件描述符与filedes共享同一个个文件描述符。

11、sync、fsync、fdatasync函数
 文件io的传统实现使用延迟写策略,增加了性能却降低了文件跟新速度,这3个函数的作用就是保证磁盘里实际的文件内容和缓冲区里内容一致。   注意:系统会周期的自动调用sync函数。
原型:#include<unistd.h>    int fsync(int filedes);    int fdatasync(int filedes);     void sync(void);

12、fcntl函数:可以改变已打开文件的性质。
原型:#include<fcntl.h>        int fcntl(int filedes, int cmd, ...)     出错返回-1
功能:(1)、复制现有文件描述符(cmd=F_DUPFD)    (2)、获得设置文件描述符标志(cmd=F_GETFD或cmd=F_SETFD)  (3)、获得或设置文件状态标志(cmd=F_GETFL或cmd=F_SETFL)   (4)、获得设置异步IO所有权(cmd=F_GETOWN或F_SETOWN)   (5)、获得设置记录锁(cmd=F_GETLK、F_SETLK、F_SETLKW)
注意:dup(filedes);等价于fcntl(filedes, F_DUPFD, 0);         dup2(filedes1, filedes2);等价于close(filedes2);    fcntl(filedes1, F_DUPFD, filedes2);

13、ioctl函数:是IO操作的杂物箱,不能用本章中其他函数表示的IO操作通常都能用ioctl表示。
原型:#include<unistd.h>   #include<sys/ioctl.h>     #include<stropts.h>
int  ioctl(int filedes, int request, ...)         若出错,返回-1

14、/dev/fd:该目录下为Linux打开文件描述符的映射。

转载于:https://www.cnblogs.com/Just-do-it110/archive/2011/07/30/2121946.html

Unix环境高级编程学习笔记(一)相关推荐

  1. Unix环境高级编程学习笔记(七) 多线程

    线程概述 线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者.传统的Unix也支持线程的概念,但是在一个进程(process ...

  2. Unix环境高级编程学习笔记(五)

    第七章 进程环境 1.main函数:int main(int argc, char *argv[]) 2.进程中止: 正常中止:(1)从main返回;(2)调用exit;(3)调用_exit或_Exi ...

  3. UNIX环境高级编程 学习笔记 第十六章 网络IPC:套接字

    socket的设计目标之一:同样的接口既可以用于计算机间通信,也可以用于计算机内通信.socket接口可采用许多不同的网络协议进行通信,本章讨论限制在因特网事实上的通信标准:TCP/IP协议栈. 套接 ...

  4. Unix环境高级编程学习笔记(二)

    第四章 文件和目录 本章将描述文件系统特征和文件性质 1.stat.fstat和lstat函数 原型:#include<sys/stat.h> int stat(const char* r ...

  5. 文件和目录(二)--unix环境高级编程读书笔记

    在linux中,文件的相关信息都记录在stat这个结构体中,文件长度是记录在stat的st_size成员中.对于普通文件,其长度可以为0,目录的长度一般为1024的倍数,这与linux文件系统中blo ...

  6. 《UNIX环境高级编程》笔记 第五章-标准IO库

    1. 流和FILE对象 在第三章的系统调用都是围绕文件描述符fd的.但是标准I/O库函数操作则是围绕流进行的.当使用标准I/O库打开或创建一个文件时,使用一个流与一个文件关联. 当打开一个流时,标准I ...

  7. 高级IO(一)--UNIX环境高级编程读书笔记

    在前面学习了文件IO,标准IO和终端IO,现在学习高级IO,UNIX中怎么有这么多的IO. 1.非阻塞IO 可以将系统调用分为两类:低速系统调用和其他.低速系统调用是可能会使进程永远阻塞的一类系统调用 ...

  8. 《UNIX环境高级编程》笔记 第十三章-守护进程

    1. 概念 守护进程(daemon)是生存期长的一种进程.它们常常在系统引导装入时启动,仅在系统关闭时才终止.因为它们没有控制终端,所以说它们是在后台运行的. Linux的大多数服务就是用守护进程实现 ...

  9. 《UNIX环境高级编程》笔记 第十九章-伪终端

    1. 概念 伪终端这个术语是指,对于一个应用程序而言,它看上去像一个终端,但事实上它并不是一个真正的终端.下图是伪终端的一个典型安排 通常,一个进程打开伪终端主设备,然后调用fork,子进程建立一个新 ...

最新文章

  1. 【Big Data - Hadoop - MapReduce】通过腾讯shuffle部署对shuffle过程进行详解
  2. 21.5. 流量控制
  3. oracle 9i net基本配置
  4. 3d点击_gooood合辑:3D打印 | 精选全部3D打印案例
  5. C语言二叉树的lowest common ancestor最低公共祖先(附完整源码)
  6. 皇nity webgl与html交互文件,Vue与UnityWebGl交互通信
  7. 功放音量调节原理_玩汽车音响,功放和喇叭,应该如何做好匹配?
  8. Git笔记(28) 签署工作
  9. 整合SQL Server 2012和2014
  10. 测评分享丨海思Hi3519AV100开发板功能测试
  11. 自制批量 PDF 转图片的工具软件(附百度网盘地址)
  12. 囿 (内容转载自wiki)
  13. zigbee3.0 ota 实验
  14. 计算机组成原理测试题——第5章 输入输出系统(上)(2)
  15. 八数码(Eight Digits)问题:宽度优先搜索、全局择优搜索、A*算法(C语言实现)
  16. python之NetworkX的使用
  17. UI设计电脑配置要求,UI设计笔记本可以吗?
  18. Discuz! 帖子外链自动添加nofollow的方法
  19. CocoaPods使用中的invalid byte sequence in US-ASCII错误
  20. 视频教程-Python爬虫视频课程:中国女性胸部大小分析-Python

热门文章

  1. Centos更换阿里云源
  2. 小程序 md5 32位加密
  3. [HDU] 5444.Elven Postman (堆)
  4. Spring使用支付宝扫码支付
  5. form 中Enctype=multipart/form-data 的作用
  6. 22.调用element方法控制dom元素
  7. .NET获取机器信息
  8. 作业九 ——报告及总结
  9. Spring整合Quartz定时发送邮件
  10. javascript基础整理