APUE学习笔记之文件I/O

首先,这里讨论的函数均是不带缓存I/O,即每个read和write都调用内核中的一个系统调用。

这里讨论5个函数,分别是open、read、write、lseek以及close。

使用以下函数及常数,需包含头文件fcntl.h

 

文件描述符(handle)是一个非负整数,有以下三个特殊文件描述符

  • 0 —— 标准输入(STDIN_FILENO)    (需包含头文件unistd.h)
  • 1 —— 标准输出(STDOUT_FILENO)
  • 2 —— 标准错误输出(STDERR_FILENO)

int open(const char * pathname, int oflag, ……mode_t mode);

open函数返回文件描述符

参数pathname表示文件的名字

参数oflag包括以下选项:

  • O_RDONLY, O_WRONLY, O_RDWR:这三个选项必须且只能选一个
  • O_CREAT:若文件不存在则创建它
  • O_TRUNC:若文件存在则将长度截为0

一般的组合为O_RDWR | O_CREAT | O_TRUNC

参数mode表示文件访问位

 

int close(int handle);

一个进程终止时,它所有的打开文件都由内核自动关闭。


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

按系统默认,当打开一个文件时,除非指定O_APPEND选项,否则位移量被默认设为0,即从头开始,偏移量以字节为单位

lseek返回新偏移量的值

文件偏移量由参数offset和whence共同决定:

  • whence=SEEK_SET,偏移量为距文件开始处的offset个字节
  • whence=SEEK_CUR,偏移量为当前偏移量+offset
  • whence=SEEK_END,偏移量为文件长度+offset

文件偏移量应是一个非负整数,但可以大于当前文件长度(这会在文件中造成一个空洞)

当多个进程同时打开同一文件时,它们有各自的偏移量,但拥有相同的文件访问权限


ssize_t read(int handle, void * buff, size_t size);

如read成功,read函数返回读取的字节数;若到达文件尾端,则返回0;读取出错返回-1

参数buff是存放读取数据的缓存的指针

参数size表示读取数据的长度,一般与缓存大小一致


sszie_t write(int handle, const void * buff, size_t size);

返回值、参数意义与read函数类似

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值