大多数文件I/O 只需要用到 5个函数 :    open , read , write , lseek , close

本章描述的都是不带缓冲的I/O(read write 都调用内核中的一个系统调用)

文件描述符

对于内核而言,所有文件都通过文件描述符引用。

文件描述符是一个非负整数

打开或创建一个新文件时,内核都将返回一个文件描述符

文件描述符的范围是 0~OPEN_MAX-1

函数 open 和 openat

调用 open 或 openat 可以打开或创建一个文件

int open( const char *path , int oflag , . . . /* mode_t mode */  )

int  openat( int fd , const char *path , int oflag , . . . /* mode_t mode */

仅当创建新文件时才使用最后的课表参数。

oflag参数可以用来说明此函数的多个选项:

O_RDONLY    只读打开

O_WRONLY   只写打开

O_RDWR       读写打开

open 和 openat 返回的文件描述符,一定是最小的未用描述符数值

函数 creat

调用creat函数创建一个新文件

int creat ( const char *path , mode_t mode)

效果等同于 open( path , O_WRONLY | O_CREAT | O_TRUNC , mode )

creat 以只写方式打开所创建的文件。

函数 close

调用此函数关闭一个打开文件。

int close ( int fd )

函数 lseek

每个打开文件都有一个 文件偏移量。 用来度量从文件开始处计算的字节数。

读,写操作都从当前偏移量开始,并增加所读写的偏移量。

off_t lseek ( int fd ,off_t offset , int whence) ;

whence 参数 :

SEEK_SET          从文件开始处便宜offset个字节

SEEK_CUR         从文件偏移量设置当前值加offset

SEEK_END         将偏移量设置为文件长度加偏移量

lseek调用成功后返回新的偏移量

函数 read

从打开的文件中读数据

ssize_t read( int fd, void *buf, size_t nbytes)

调用成功返回读取到的字节数,达到文件末端返回0。

函数 write

向打开文件写数据

ssize_t write ( int fd, void *buf, size_t nbytes)

返回值通常与 nbytes 相同。

文件共享

内核使用 3 种数据结构表示打开文件:

(1) 进程表项

1.文件描述符

2.指向文件表项的指针

(2)文件表项

1.文件状态标志 ( 比如 读,写,非阻塞等 )

2.当前文件偏移量

3.指向V节点表项的指针

(3)V节点表项

每个打开文件都有一个V节点结构。

函数 pread 和 pwrite

属于原子操作。

不更新当前文件偏移量

函数 dup 和 dup2

复制一个现有的文件描述符

int dup( int fd )

int dup2( int fd , int fd2 )

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

调用 dup(fd) 等同于 fcntl ( fd , F_DUPED , 0 )

调用 dup2(fd,fd2) 等同于 close(fd2);fcntl(fd,F_DUPED, fd2);

函数 sync , fsync 和 fdatasync

将缓冲区的数据写入磁盘

函数fcntl

用来改变已打开文件的属性

int fcntl ( int fd , int cmd , . . . /* int arg */  );

参数cmd :

复制一个已有的描述符 F_DUPFD 或 F_DUPFD_CLOEXEC

获取/设置文件描述符   F_GETFD 或 F_SETFD

获取/设置文件状态标志 F_GETFL 或 F_SETFL

获取/设置异步I/O所有权 F_GETOWN 或 F_SETOWN

获取/设置记录锁           F_GETLK       F_SETLK        F_SETLKW

UNIX环境高级编程 文件I/O的更多相关文章

  1. UNIX环境高级编程——文件I/O

    一.文件描述符 对于Linux而言,所有对设备或文件的操作都是通过文件描述符进行的.当打开或者创建一个文件的时候,内核向进程返回一个文件描述符(非负整数).后续对文件的操作只需通过该文件描述符,内核记 ...

  2. UNIX 环境高级编程 文件和目录

    函数stat , fstat , fstatat , lstat stat函数返回与此文件有关的信息结构. fstat函数使用已打开的文件描述符(而stat则使用文件名) fstatat函数 为一个相 ...

  3. UNIX环境高级编程——文件和目录

    一.获取文件/目录的属性信息 int stat(const char *path, struct stat *buf); int fstat(int fd, struct stat *buf); in ...

  4. UNIX环境高级编程---标准I/O库

    前言:我想大家学习C语言接触过的第一个函数应该是printf,但是我们真正理解它了吗?最近看Linux以及网络编程这块,我觉得I/O这块很难理解.以前从来没认识到Unix I/O和C标准库I/O函数压 ...

  5. (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  6. (三) 一起学 Unix 环境高级编程 (APUE) 之 文件和目录

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  7. (四) 一起学 Unix 环境高级编程(APUE) 之 系统数据文件和信息

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  8. UNIX环境高级编程笔记之文件I/O

    一.总结 在写之前,先唠几句,<UNIX环境高级编程>,简称APUE,这本书简直是本神书,像我这种小白,基本上每看完一章都是“哇”这种很吃惊的表情.其实大概三年前,那会大三,我就买了这本书 ...

  9. [置顶] 文件和目录(二)--unix环境高级编程读书笔记

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

随机推荐

  1. vscode + angular

    0.在命令行中,cd到项目下执行: npm install 1.调试->启动调试->node.js, 会生成.vscode/launch.json文件 2.修改launch.json文件& ...

  2. 2017ACM/ICPC广西邀请赛-重现赛1005 CS course

    2017-08-31 16:19:30 writer:pprp 这道题快要卡死我了,队友已经告诉我思路了,但是做题速度很缓慢,很费力,想必是因为之前 的训练都是面向题解编程的缘故吧,以后不能这样了,另 ...

  3. VS2012 QT5.2.0 无法解析的外部符号

    背景:在新建QT工程时,可能没有选择一些库,虽然在头文件中引用了,但是程序依然无法识别 现象:一般出现"LNK2019"错误. 解决:以网络为例,在VS2012中加入网络库,分为两 ...

  4. 【Python】“UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9”根因及解决方法

    背景 自动化测试调用HTMLTestRunner生成测试报告的时候,出现了编码错误,错误如题 原因 搜索了很多资料,得出的结论是python的str默认是ascii编码,和unicode编码冲突,就会 ...

  5. Angular for TypeScript 语法快速指南 (基于2.0.0版本)

    引导 import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; platformBrowserDynami ...

  6. mysql数据库优化课程---13、mysql基础操作

    mysql数据库优化课程---13.mysql基础操作 一.总结 一句话总结:mysql复制表,索引,视图 1.mysql如何复制表? like select * 1.复制表结构 create tab ...

  7. Android----- 版本更新和 服务器下载新版本APK并安装

    前段时间有朋友问我版本更新的问题,所以来写一篇版本更新和APK下载并安装的博客. 版本更新,几乎在所有的项目中都用的到,一般是这样的流程,当进入APP首页是便会检测版本是否为最新版本,不是则提示你下载 ...

  8. 【原创】Centos 7利用软件Raid搭建ISCSI过程

    测试机器安装了4块2T硬盘,一块320G硬盘,利用320G硬盘安装CentOS 7系统,在CentOS 7系统上利用4块2T硬盘组建Raid 0,再配置iSCSI存储.注意,本文中的RAID指的是软R ...

  9. cookie、session、sessionStorage、localStorage

    Cookie cookie是存储在浏览器端,并且随浏览器的请求一起发送到服务器端的,它有一定的过期时间,到了过期时间自动会消失. 首次设置cookie时是由服务器端发送到浏览器端 ,之后每次浏览器发送 ...

  10. HTML5页面,用JS 禁止弹出手机键盘

    用户点击input的时候: 会默认调出手机软键盘: 场景:文本框获取焦点时,需要禁止手机弹出自带的输入键盘: 解决方案1: 用一个p/div等标签显示内容:然后放一个隐藏的input: (可能的场景: ...