三)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出错的常见原因是磁盘空间不够,或者超过了一个给定进程的文件长度限制;
相关文章推荐
- Linux VS Unix:Linux欲一统天下 Unix不死
- 看UNIX高手的10个习惯第1/2页
- 通过PHP修改Linux或Unix口令的方法分享
- mysql unix准换时间格式查找指定日期数据代码
- php strtotime 函数UNIX时间戳
- 安全检测Unix和Linux服务器安全设置入门精讲
- 分享20个Unix/Linux 命令技巧
- PHP使用gmdate实现将一个UNIX 时间格式化成GMT文本的方法
- C的温故知新
- 使用golang和docker守护进程交互
- Alice梦游UNIX仙境
- LINUX之前UNIX的历史
- 关于GNU计划
- Unix 调试的瑞士军刀:lsof
- Linux/Unix 新手和专家教程
- oracle大型数据库系统在AIX/unix上的实战详解 讨论76 Oracle备份问题
- oracle大型数据库系统在AIX/unix上的实战详解 讨论76 Oracle备份问题
- UNIX操作系统的优势总结
- 常用Unix系统 逝去的美好
- Linux将取代Unix开始新的应用