UNIX环境高级编程 文件I/O
大多数文件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的更多相关文章
- UNIX环境高级编程——文件I/O
一.文件描述符 对于Linux而言,所有对设备或文件的操作都是通过文件描述符进行的.当打开或者创建一个文件的时候,内核向进程返回一个文件描述符(非负整数).后续对文件的操作只需通过该文件描述符,内核记 ...
- UNIX 环境高级编程 文件和目录
函数stat , fstat , fstatat , lstat stat函数返回与此文件有关的信息结构. fstat函数使用已打开的文件描述符(而stat则使用文件名) fstatat函数 为一个相 ...
- UNIX环境高级编程——文件和目录
一.获取文件/目录的属性信息 int stat(const char *path, struct stat *buf); int fstat(int fd, struct stat *buf); in ...
- UNIX环境高级编程---标准I/O库
前言:我想大家学习C语言接触过的第一个函数应该是printf,但是我们真正理解它了吗?最近看Linux以及网络编程这块,我觉得I/O这块很难理解.以前从来没认识到Unix I/O和C标准库I/O函数压 ...
- (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- (三) 一起学 Unix 环境高级编程 (APUE) 之 文件和目录
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- (四) 一起学 Unix 环境高级编程(APUE) 之 系统数据文件和信息
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- UNIX环境高级编程笔记之文件I/O
一.总结 在写之前,先唠几句,<UNIX环境高级编程>,简称APUE,这本书简直是本神书,像我这种小白,基本上每看完一章都是“哇”这种很吃惊的表情.其实大概三年前,那会大三,我就买了这本书 ...
- [置顶] 文件和目录(二)--unix环境高级编程读书笔记
在linux中,文件的相关信息都记录在stat这个结构体中,文件长度是记录在stat的st_size成员中.对于普通文件,其长度可以为0,目录的长度一般为1024的倍数,这与linux文件系统中blo ...
随机推荐
- linux 卸载jdk和安装
卸载JDK 1.先输入java -version 查看是否安装了jdk 2.如果安装了,检查下安装的路径 which java(查看JDK的安装路径) 3.卸载 rm -rf JDK地址(卸载JDK) ...
- 上采样和PixelShuffle(转)
有些地方还没看懂, mark一下 文章来源: https://blog.csdn.net/g11d111/article/details/82855946 去年曾经使用过FCN(全卷积神经网络)及其派 ...
- mac配置jenkins遇到的问题及解决办法
写这篇博客的时候,我暂时放弃了mac配置jenkins,先记着遇到的坑吧.虽然无数次想砸电脑,但是回头想想,对于经常用windows系统和接触过linux的测试的我来说,这也是个熟悉mac系统的机会. ...
- vim与shell切换
扩展一些vim的知识. vim与shell切换 :shell 可以在不关闭vi的情况下切换到shell命令行. :exit 从shell回到vim. 文件浏览 :Ex 开启目录浏览器,可以浏览当前目录 ...
- RabbitMQ 与 AMQP路由
概述 RabbitMQ(MQ 为 MessageQueue) 是一个消息队列,主要是用来实现应用程序的异步和解耦,同时起到消息缓冲.消息分发作用 消息队列 消息(Message)是指应用间传送的数据, ...
- iQuery移动端手势事件插件-jGestures
jGestures下载 jGestures事件简介 orientationchange 代表设备顺时针或者逆时针旋转.此事件可以被设备触发,可能使用的是重力传感器. pinch 缩放手势(两个手指在屏 ...
- 简述<T> 与 <?>
引 jdk1.5以后引入了泛型的概念,即:<>,规定了集合中元素类型 比如下面代码: List list1 = new ArrayList(); List<String> li ...
- spring mvc:练习:表单验证(javaConfig配置和注解)
使用Spring表单标签, 表单验证使用 JSR303 的验证注解,hibernate-validators,提供了使用MessageSource和访问静态资源(如CSS,JavaScript,图片) ...
- Error:Cannot access first() element from an empty List
解决方案: bintray版本问题,修改为: classpath 'com.novoda:bintray-release:0.3.4' 如下: buildscript { repositories { ...
- Java中操作Redis
一.server端安装 1.下载 https://github.com/MSOpenTech/redis 可看到当前可下载版本:redis2.6 下载后的文件为: 解压后,选择当前64位win7系统对 ...