关闭

三)Unix文件I/O(1)

标签: UNIX环境高级编程apueI-OUNIX
202人阅读 评论(0) 收藏 举报
分类:

引言

主要用到5个函数:

  • open
  • read
  • wirte
  • close
  • lseek

分为两类:

  • 带缓冲的I/O
  • 不带缓冲的I/O

文件描述符

  • 打开的文件的标识符,非负整数,幻数0,1,2已经被标准化,0表示标准输入,1表示标准输出,2表示标准错误;所以理论上文件描述符应该从3开始;
  • 文件描述符的范围是从0~OPEN_MAX-1,早期的unix采用的上限是19,但现在很多系统都增加到63,后来基本无限;
  • 幻数:为了方便记忆,赋予特定意义的数字。

函数open和openat

int open(const char path, int oflag, …/*mode_t mode/);
int openat(int fd, const char path, int oflag, …/*mode_t mode/);

  • fd:文件描述符
  • path:文件路径(绝对路径/相对路径)
  • oflag:打开方式标识
  • mode_t:

fd参数将open和openat函数分开,主要分为以下三种情况:
1. path为绝对路径,这种情况下fd将被忽略,open和openat是一样的;
2. path为相对路径,fd指出了相对路径的开始路径;
3. path为相对路径,fd指向当前目录,此时open和openat也是一样的;

函数creat

int creat(const char *path, mode_t mode);

此函数等价与:

open(path, O_WRONLY| O_CREAT| O_TRUNC, mode);
creat的一个不足之处是它以只写方式打开创建的文件。

函数close

int close(int fd);
成功返回0,出错返回-1

关闭一个文件,会释放该进程加在该文件上的所有记录锁,当一个进程终止时,内核会自动关闭它所有的打开文件。

函数lseek

off_t lseek(int fd, offt_t offset, int whence);
返回值:成功返回新的文件偏移量,出错返回-1

对参数offset的解释以来与whence:
- whence=SEEK_SET:将文件的偏移量设置为距文件开始出offset字节处;
- whence=SEEK_CUR:将文件的偏移量设置为当前值加上offset,offset可正可负;
- whence=SEEK_END:将文件的偏移量设置为文件长度加上offset,offset可正可负;
以此可获取当前文件的偏移量:

off_t currpos;
currpos = lseek(fd, 0, SEEK_CUR);

这种方法也可以判断所涉及的文件是否可以设置偏移量,例如文件指向一个管道或者FIFO,则lseek返回-1,并将errno设置为:ESPIPE

注:
- 偏移量在某些设备上可以为负数,但是一般文件都是非负数,所以在处理lseek的返回值时,不要测试它是否小于0,要测试它是否等于-1;
- lseek只处理偏移量,不引起任何I/O
- 文件偏移量可以大于当前文件长度,这样会在下次写入时加长该文件,并在文件中构成一个空洞,这一点是允许的,但是空洞并不要求在磁盘上占用存储区,具体处理方式和文件系统相关;
- lseek的偏移量是用off_t类型表示的,所以各个平台的实现一定一样,现今平台大致使用两组接口处理,一种是32位,一种是64位。一般设为64为;

函数read

ssize_t read(int fd, void *buf, size_t nbytes)
返回读到的字节数,如果已到文件尾返回0,若出错,返回-1

有多种情况可使读到的字节数少于要求读的字节数:

  • 已读到末尾;
  • 从终端设备读取,每次最多读一行;
  • 从网络读时,可能由于缓冲机制;
  • 从管道或FIFO读时,管道包含的字节少于所需的数量;
  • 从某些面向记录的设备中读,一次最多返回一条记录;
  • 信号中断,已经读了部分数据量;

函数write

ssize_t write(int fd, const void *buf, size_t nbytes);
成功返回写入的字节数,失败返回-1

write出错的常见原因是磁盘空间不够,或者超过了一个给定进程的文件长度限制;

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:26911次
    • 积分:772
    • 等级:
    • 排名:千里之外
    • 原创:52篇
    • 转载:2篇
    • 译文:0篇
    • 评论:12条
    最新评论