3.1Apue文件IO——文件描述符以及read/write/open/close的使用

文件描述符

文件描述符是一个非负的整数
当打开一个现有文件或创建一个新的文件时,内核向进程返回一个文件描述符。
当使用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

原型:
在这里插入图片描述

  1. 参数pathname:要打开或创建文件的名字
  2. 参数flags
  • 必选项:常用的互斥的三个O_RDONLY(只读打开)O_WRONLY(只写打开)O_RDWR(读写打开)。只能选一个
  • 可选项,可使用|指定多个选项:
    O_APPEND:每次写时都追加到文件尾端
    O_CREAT:若此文件不存在则创建,使用它时,需要用第三个参数mode指定访问权限位
    O_EXCL:如果同时指定了O_CREAT,而文件已存在,则出错。若不存在,则创建它。这使测试和创建两者成为一个原子操作
    O_TRUNC:若文件存在且可写,则将其长度截断为0
    O_NONBLOCK:如果path引用的是一个FIFO,一个块特殊文件或一个字符特殊文件,则此选项为文件的本次打开操作和后续的IO操作设置非阻塞方式
  1. 返回值
    返回一个文件描述符,一定是最小的未使用的文件描述符
5)函数close

原型:
在这里插入图片描述
它希望通过文件描述符fd关闭一个打开文件
其实当一个进程终止时,内核会自动关闭它的所有打开文件。于是也可不显式地通过close关闭打开文件。

猜你喜欢

转载自blog.csdn.net/CSDN_dzh/article/details/85056929
今日推荐