一. 各种I/O函数
输入/输出是在主存和外部设备之间拷贝数据的过程。下图是本文讨论的各种I/O之间的关系。
Unix I/O模型是在操作系统内核中实现的,较高级的I/O都是基于Unix I/O函数来实现的。
本文主要介绍几种Unix I/O 函数
二.Unix I/O 函数
1、打开/关闭函数
打开文件函数open的原型:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
-
功能:打开一个文件并返回这个文件的描述符
-
文件描述符:就是文件表项的下标 文件表项就是一个矢量 即数组。
数组中存储了文件描述符和文件指针。文件描述符本质就是这个文件指针在数组中的下标。 -
参数:
1) pathname:带路径的文件名
2) flags:打开文件的标志,可以使用位或的我形式添加一下成员:
O_WRONLY :只写权限
O_RDONLY :只读权限
O_RDWR :可读可写权限
以上三个标志必须并且只能选择其中一个!
可以位或一下几个:
O_APPEND :追加方式 写数据到文件末尾。
O_CREAT :创建标志,如果文件不存在就创建,存在则打开。
O_EXCL :该标志一般与O_CREAT一起使用,用来测试文件是否存在,如果存在且是一个普通文件则报错,如果不存在则创建!
O_NONBLOCK :非阻塞方式打开文件。
O_TRUNC :截断标志 假如文件存在且是一个普通文件,而且打开的方式是O_RDWR 或者O_WRONLY,那么文件就会被清空。
3) mode :指定了新文件的访问权限位,这些位的符号名字如下图所示。
前两个参数是第一个open函数和第二个函数共有的参数,第三个参数只有当第二个参数flags中有O_CREAT 时才有意义。
关闭函数close的原型:
#include<unistd.h>
int close(int fd)
-
参数:需要关闭的文件描述符。
-
返回值: 成功返回0,失败返回-1;
最后,进程调用close函数关闭一个已打开文件。关闭一个已关闭的描述符会出错。
2、读写一个文件
读文件函数read的原型:
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
- 功能:从文件描述符fd所指的文件中读取count个字节的数据到buf所指的内存中。
- 参数:
1)fd: 文件描述符 open的返回值。
2)buf:存储读取数据的内存的首地址。
3)count: 读取数据的大小。 - 返回值:成功返回读取到数据的字节数,失败返回-1;
返回值 >0 说明读取到了数据 并且数据大小就是 返回值的大小。
=0 说明文件已经读完了。
<0 说明出错了。
写文件函数write的原型:
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
- 功能:将buf所指的内存中的count个字节的数据写入到fd这个文件中。
- 参数:
1)fd 文件描述符 open的返回值。
2)buf 存储写入数据的内存的首地址。
3)count 写入数据的大小。 - 返回值: 成功返回 ,成功写入数据的大小;失败返回 -1;
返回值 >0 说明写入了返回值大小的数据。
=0 说明什么东西都没写进去。
<0 写入失败;最典型的写入失败就是没有权限操作时的写入。
3、定位
lseek函数原型:
#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);
- 参数:fd 文件描述符。
- offset: 偏移量。
- whence :从哪里开始偏移 ,有以下三个取值:
SEEK_SET :从文件头开始偏移 此时 offset只能为正。
SEEK_END :从尾巴开始偏移。
SEEK_CUR :从当前位置开始偏移,偏移量可正可负,正为向后偏移,负为向前偏移。 - 返回值:成功返回当前光标位置相对于文件头的距离;失败返回-1。
4、删除一个空目录或者普通文件
remove函数原型:
#include <stdio.h>
int remove(const char *pathname);
- 功能:删除一个普通文件或空目录。
- 参数:带路径的文件名或空目录名。
- 返回值:成功返回0,失败返回-1。