文件描述符
文件描述符是一个
非负的整数
。
当打开一个现有文件或创建一个新的文件时,内核向进程返回一个文件描述符。
当使用open返回的文件描述符标识该文件
,将其作为参数传递
给read或write
read、write、open的基本使用示例
示例1:从标准输入读,向标准输出写
该示例用于不断从标准输入读取数据,向标准输出写入数据
/// for read()
#include <unistd.h>
#define BUFFERSIZE 1024
int main(int argc, char *argv[]) {
int read_len = 0;
char buf[BUFFERSIZE] = {0};
while ((read_len = read(STDIN_FILENO, buf, BUFFERSIZE)) > 0) {
write(STDOUT_FILENO, buf, read_len);
}
return 0;
}
示例2:打开和创建文件并从文件读写
该示例用于文件内容从文件src到文件dst的拷贝
/// for read()、write()
#include <unistd.h>
/// for open()
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define BUFFERSIZE 1024
int main(int argc, char *argv[]) {
/// 只读方式打开文件
int srcfd = open(argv[1], O_RDONLY);
/// 创建一个权限为0666的只写文件
int dstfd = open(argv[2], O_CREAT|O_WRONLY, 0666);
int read_len = 0;
char buf[BUFFERSIZE] = {0};
while ((read_len = read(srcfd, buf, BUFFERSIZE)) > 0) {
write(dstfd, buf, read_len);
}
close(srcfd);
close(dstfd);
}
示例解析
1)常量STDIN_FILENO、STDOUT_FILENO、STDERR_FILENO
这两个常量定义在头文件
<unistd.h>
中,指定了标准输入
、标准输出
和标准错误
的文件描述符
,对应的关联文件描述符分别是0,1,2
2)函数read
原型:
用处:它希望通过文件描述符fd
读取count字节
的数据
size_t可以理解成 unsigned int,而 ssize_t 可以理解成 int
read函数返回读取的字节数,此值用作要写的字节数
,
返回 0
:读取到了文件末尾
返回-1
:读取出错
当从管道或FIFO读时,如果管道包含的字节少于所需的数量,那么read将只返回实际可用的字节数
3)函数write
原型:
用处:它希望向文件描述符fd
写入count字节
的数据
write函数返回实际写入的字节数
对于普通文件,写操作从文件的当前偏移量处开始。
4)函数open
原型:
- 参数
pathname
:要打开或创建文件的名字- 参数
flags
:
- 必选项:常用的
互斥的
三个O_RDONLY(只读打开)
,O_WRONLY(只写打开)
,O_RDWR(读写打开)
。只能选一个- 可选项,可使用
|
指定多个选项:
O_APPEND
:每次写时都追加到文件尾端
O_CREAT
:若此文件不存在则创建,使用它时,需要用第三个参数mode指定访问权限位
O_EXCL
:如果同时指定了O_CREAT,而文件已存在,则出错。若不存在,则创建它。这使测试和创建两者成为一个原子操作
O_TRUNC
:若文件存在且可写,则将其长度截断为0
O_NONBLOCK
:如果path引用的是一个FIFO,一个块特殊文件或一个字符特殊文件,则此选项为文件的本次打开操作和后续的IO操作设置非阻塞方式
- 返回值
返回一个文件描述符,一定是最小的未使用的文件描述符
5)函数close
原型:
它希望通过文件描述符fd
关闭一个打开文件
其实当一个进程终止
时,内核会自动关闭它的所有打开文件
。于是也可不显式地通过close关闭打开文件。