大多数文件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

最新文章

  1. NoSQl简介(转)
  2. MySQL乱码解决办法
  3. java io读书笔记(5) Writing Bytes to Output Streams
  4. pip安装模块警告InsecurePlatformWarning: A true SSLContext object is not available.
  5. jmeter随笔(29)-关于自己的jar包和beanshell的使用
  6. CoreAnimation4-隐式动画和显式动画
  7. Android性能优化之ViewStub
  8. EffectiveC#1--尽可能的使用属性(property),而不是数据成员(field)
  9. 微信token认证方法原理
  10. java读取配置文件的几种方法
  11. 补写:Best Coder #85 1001 Sum(前缀和)
  12. Python之旅.第三章.函数3.26
  13. deepin linux学习笔记(四)进不去图形界面怎么办?
  14. linux进程管理总结
  15. win7 系统中的加密文件打不开了
  16. 前台返回json数据的常用方式+常用的AJAX请求后台数据方式
  17. Maven web 项目工程的建立
  18. [原]Jenkins(二)---jenkins之Git+maven+jdk+tomcat
  19. golang postgresql CRUD
  20. python-day47--pymysql模块

热门文章

  1. Redis中RedisTemplate和Redisson管道的使用
  2. Linux系统CentOS使用yum方式安装指定版本的PHP 添加yum源 从PHP5.3升级到5.4/5.5/5.6
  3. LeetCode——Largest Rectangle in Histogram
  4. 转:web.xml 中的listener、 filter、servlet 加载顺序及其详解
  5. 【Semantic Segmentation】Segmentation综述
  6. python find命令、startwith命令
  7. 检签 sub sup应用
  8. HAproxy的安装配置及动静分离
  9. 【Python】模块学习之ConfigParser读写配置信息
  10. linux bash shell中,单引号、 双引号,反引号(``)的区别及各种括号的区别