您的位置:首页 > 产品设计 > UI/UE

三)Unix文件I/O(1)

2015-07-11 10:38 316 查看

引言

主要用到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出错的常见原因是磁盘空间不够,或者超过了一个给定进程的文件长度限制;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息