📜  文件描述符 linux c++ (1)

📅  最后修改于: 2023-12-03 15:40:04.614000             🧑  作者: Mango

Linux文件描述符

在Linux系统中,文件描述符是与文件或其他输入/输出资源相关联的整数标识符。所有打开的文件(包括标准输入输出和网络套接字)都由文件描述符引用。在C++编程中,我们可以使用文件描述符来从文件中读取和写入数据,或进行网络通信等操作。

打开文件

我们可以使用系统调用 open() 来打开文件。该函数的原型如下:

#include <fcntl.h>
int open(const char* pathname, int flags [, mode_t mode]);

其中,pathname是要打开的文件名,flags指定了打开方式和打开文件的读写权限,mode指定了创建文件时的权限(只有在文件不存在时才会使用)。常用的flags参数有:

  • O_RDONLY:只读方式打开文件。
  • O_WRONLY:只写方式打开文件。
  • O_RDWR:读写方式打开文件。
  • O_CREAT:若文件不存在则创建文件。
  • O_EXCL:与O_CREAT联合使用,若文件已经存在则报错。

示例代码:

#include <fcntl.h>
#include <iostream>
#include <cstdlib>   // exit()

int main() {
    int fd = open("test.txt", O_CREAT | O_WRONLY, S_IRWXU); // 若文件不存在则创建文件,并以只写方式打开
    if (fd == -1) {
        std::cerr << "Failed to open file." << std::endl;
        std::exit(EXIT_FAILURE);
    }
    // do something
    close(fd);  // 关闭文件
    return 0;
}
读写文件

read()write()是使用文件描述符进行读写操作的系统调用。它们的原型如下:

#include <unistd.h>

ssize_t read(int fd, void* buf, size_t count);
ssize_t write(int fd, const void* buf, size_t count);

其中,fd是文件描述符;buf是存放读写数据的缓冲区;count是要读写的字节数。

示例代码:

#include <fcntl.h>
#include <unistd.h>
#include <iostream>
#include <string>
#include <cstdlib>   // exit()

int main() {
    int fd = open("test.txt", O_RDWR, 0);   // 以读写方式打开文件
    if (fd == -1) {
        std::cerr << "Failed to open file." << std::endl;
        std::exit(EXIT_FAILURE);
    }

    // 写入数据
    std::string str = "Hello, world!";
    ssize_t written = write(fd, str.c_str(), str.length());
    if (written == -1) {
        std::cerr << "Failed to write to file." << std::endl;
        std::exit(EXIT_FAILURE);
    }

    // 将文件指针移回文件开头
    lseek(fd, 0, SEEK_SET);

    // 读取数据
    char buf[256] = {0};
    ssize_t nread = read(fd, buf, sizeof(buf));
    if (nread == -1) {
        std::cerr << "Failed to read from file." << std::endl;
        std::exit(EXIT_FAILURE);
    } else if (nread == 0) {
        std::cerr << "End of file." << std::endl;
    } else {
        std::cout << "Read " << nread << " bytes: " << buf << std::endl;
    }

    close(fd);
    return 0;
}
关闭文件

在使用文件描述符完成读写操作后,我们需要使用close()关闭文件描述符。该函数原型如下:

#include <unistd.h>
int close(int fd);

其中,fd是要关闭的文件描述符。

示例代码:

int fd = open("test.txt", O_RDONLY, 0); // 以只读方式打开文件
// do something
close(fd);  // 关闭文件
参考资料