• 【Linux】文件操作


    在这里插入图片描述

    欢迎来到Cefler的博客😁
    🕌博客主页:那个传说中的man的主页
    🏠个人专栏:题目解析
    🌎推荐文章:题目大解析(3)

    在这里插入图片描述


    👉🏻文件是什么?

    文件 = 内容+属性
    所有对文件的操作:a.对内容操作 b.对属性操作。
    内容是数据,属性其实也是数据。我们访问一个文件(我们是一个进程!),一个文件打开前是:普通的磁盘文件,打开后:将文件加载到内存
    一个进程可以打开多个文件

    我们研究文件操作的本质:就是进程被打开文件的关系

    进程通过操作系统打开文件,而操作系统提供接口(如fopen)给进程打开磁盘中的文件。

    操作系统访问硬件磁盘中的文件,要加载到内存中,而操作系统要管理文件,必须先描述,再组织,所以一个文件的要被打开,一定先在内核中形成被打开的文件对象,即描述PCB

    👉🏻C常见文件接口复习

    1.fopen以写的形式打开,源文件内容会被清空

    2.向文件写入字符串,strlen(str),不需要加+1,即不用写入\0

    👉🏻open函数

    C语言中的open()函数是打开文件的函数,它可以用于创建或打开文件,并返回一个文件描述符(file descriptor)。

    open()函数的声明如下:

    #include 
    
    int open(const char *pathname, int flags);
    int open(const char *pathname, int flags, mode_t mode);
    
    • 1
    • 2
    • 3
    • 4

    其中,第一个参数pathname是指要打开(或创建)的文件的路径名,这个参数是必须的。第二个参数flags是一个控制文件打开方式的标志,这个参数也是必须的。第三个参数mode表示新建文件时的权限,只有在创建新文件时才需要传入。

    flags参数常用的取值如下:

    • O_RDONLY:只读模式打开文件
    • O_WRONLY:只写模式打开文件
    • O_RDWR:读写模式打开文件
    • O_CREAT:如果文件不存在则创建文件
    • O_TRUNC:如果文件已经存在,则把文件截断为0长度
    • O_APPEND:以追加模式打开文件

    mode参数常用的取值如下:

    • S_IRUSR:用户读权限
    • S_IWUSR:用户写权限
    • S_IXUSR:用户执行权限
    • S_IRGRP:组读权限
    • S_IWGRP:组写权限
    • S_IXGRP:组执行权限
    • S_IROTH:其他用户读权限
    • S_IWOTH:其他用户写权限
    • S_IXOTH:其他用户执行权限

    open()函数返回一个文件描述符,这个描述符是一个整数值,它是操作系统为了方便管理文件而提供的一种接口。在后续的文件读写等操作中,我们可以使用这个文件描述符来指代该文件。

    如果open()函数执行成功,则返回一个非负整数(文件描述符),否则返回-1。通常,当返回-1时,errno变量会被设置为下面的某个值来表示错误原因:

    • EACCES:无法访问指定文件
    • ENOENT:指定文件不存在
    • EEXIST:文件已经存在,但打开标志中指定了O_CREAT标志
    • EINVAL:打开标志无效

    例如,要以只读模式打开一个文件,可以这样调用open()函数:

    int fd;
    fd = open("/path/to/file", O_RDONLY);
    if (fd == -1) {
        perror("Error opening file");
        exit(EXIT_FAILURE);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在使用完文件后,应该使用close()函数关闭文件描述符:

    int ret;
    ret = close(fd);
    if (ret == -1) {
        perror("Error closing file");
        exit(EXIT_FAILURE);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    这是open()函数的基本用法,还有一些高级用法,比如使用open()函数打开套接字或管道等,不过这些用法超出了本回答的范围。

    文件返回值fd

    文件的返回值fd是一个连续的小整数,fd的本质就是进程文件描述符表数组的下标!

    而OS会默认先打开三个标准文件,标准输入stdin,标准输出stdout,标准错误stderr,下标分别为0,1,2。OS默认打开这三个标准,就是为了让程序员默认进行输入输出代码编写。

    进程和打开文件的对应关系,如何进行维护?

    在这里插入图片描述

    如何看待一切皆文件?

    在这里插入图片描述
    stdin,stdout,stderr这些标准文件,都有来实现读写功能的函数,而文件PCB中存储着这些函数的函数指针。

    👉🏻write函数

    write()函数是C语言中用于向文件描述符(或者套接字)中写入数据的函数。

    write()函数的声明如下:

    #include 
    
    ssize_t write(int fd, const void *buf, size_t count);
    
    • 1
    • 2
    • 3

    其中,fd是要写入的文件描述符,buf是指向要写入数据的缓冲区的指针,count是要写入的字节数。

    write()函数的返回值是成功写入的字节数,如果出现错误,则返回-1,并设置全局变量errno以指示错误类型。

    下面是一个简单的示例,演示如何使用write()函数向文件中写入数据:

    #include 
    #include 
    #include 
    #include 
    
    int main() {
        int fd;
        ssize_t bytes_written;
        const char *str = "Hello, world!\n";
        
        fd = open("output.txt", O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
        if (fd == -1) {
            perror("open");
            exit(EXIT_FAILURE);
        }
        
        bytes_written = write(fd, str, strlen(str));
        if (bytes_written == -1) {
            perror("write");
            exit(EXIT_FAILURE);
        }
        
        close(fd);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    在这个示例中,首先使用open()函数打开一个文件,然后使用write()函数向这个文件中写入数据,最后使用close()函数关闭文件描述符。

    需要注意的是,write()函数是以字节为单位进行写入的,如果要写入一个字符串,需要使用strlen()函数来获取字符串的长度。此外,write()函数并不会自动在字符串的末尾添加空字符(‘\0’),所以在写入字符串时需要确保字符串以null结尾,或者传入字符串长度时包含结尾的null字符。


    如上便是本期的所有内容了,如果喜欢并觉得有帮助的话,希望可以博个点赞+收藏+关注🌹🌹🌹❤️ 🧡 💛,学海无涯苦作舟,愿与君一起共勉成长
    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    三维模型轻量化引擎HOOPS纹理技术概览
    RobotFramework自动化测试框架系列学习----(三)Web自动化原理+实操
    Tomcat 的部署和优化
    开发者,MySQL专栏完更,助你轻松从安装到入门进阶
    STM32小项目———感应垃圾桶
    特征多项式与常系数齐次线性递推
    exploit-db图文教程
    使用 PYTORCH 进行图像风格迁移
    OSS文件上传
    【Machine Learning】13.逻辑回归小结and练习
  • 原文地址:https://blog.csdn.net/cefler/article/details/134542088