三)Unix文件I/O(1)

原创 2015年07月11日 10:38:13

引言

主要用到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出错的常见原因是磁盘空间不够,或者超过了一个给定进程的文件长度限制;

UNIX环境高级编程(5):文件I/O(1)

UNIX系统中的大多数文件I/O只需要用到5个函数:open、read、write、lseek以及close。本章说明的函数经常称为“不带缓冲的I/0”,术语不带缓冲指的是每个read和write都调...

unix环境高级编程复习-文件I/O(1)

最近刚看完APUE

三)Unix文件I/O(2)

粘着位在Unix系统中,粘着位拥有者丰富的含义: 在早期的Unix系统中,被称作sticky bit,一个可执行程序被设置了粘着位,意味着程序执行完毕后,整个程序(机器码)会被缓存在交换区,通常一般是...

UNIX环境高级编程(第三版)学习笔记(三、文件I/O之一)

1.文件描述符 对于内核而言,所有打开的文件都通过文件描述符来引用,他是一个非负数。当打开一个文件或者创建一个文件的时候,内核向进程返回一个文件描述符,open,creat,read,write等函...

《Unix网络编程》卷1:套接字联网API(第3版):基本TCP编程、TCP客户端/服务器程序、I/O复用

全书共31章+附录。 计划安排:吃透这本书,一天三章+源码,并实测代码做当天笔记,CSDN见。 时间安排:计划时间1.5个月 == 6个周末 == 12天。 2017.08.05    第01-03...

Netty学习笔记<1>--UNIX的5种I/O模型

参考书籍:Netty权威指南 参考博客:http://blog.csdn.net/CMbug/article/details/48419983 阻塞I/O模型:它是最常用的I/O模型,它是指直到应用...

UNIX网络编程1 理解同步、阻塞、非阻塞、异步网络I/O

本文侧重的是网络I/O,如blocking、non-blocking、I/O multiplexing(event driven I/O)、signal-driven(不常用)、 asynchrono...

《UNIX网络编程 卷1》 笔记: 高级I/O函数

本节我们关注称为“高级I/O”的各个函数和技术。 首先是在I/O操作上设置超时。在涉及套接字的I/O操作上设置超时的方法有以下3种; 1. 调用alarm函数,在定时时间超时产生SIGALRM信号...

《UNIX网络编程卷1》读书笔记--第六章I/O复用:select和poll函数

前言I/O复用采用轮询的方式处理多个描述符,当有文件准备好时,就通知进程。 关注点 I/O复用的应用场合 采用I/O复用的客户端和服务器程序 I/O复用的应用场合1. 当客户处理多个描述符时(通常是交...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:三)Unix文件I/O(1)
举报原因:
原因补充:

(最多只允许输入30个字)