前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >嵌入式Linux:文件共享

嵌入式Linux:文件共享

作者头像
不脱发的程序猿
发布2024-05-26 10:27:50
950
发布2024-05-26 10:27:50
举报
文章被收录于专栏:AIoT技术交流、分享

在Linux中,文件共享是指多个进程可以同时访问和操作同一个文件。

文件共享在多进程或多线程编程环境中具有重要意义,特别是在以下方面:

  1. 多线程操作大文件: 文件共享可用于实现多个线程同时操作同一个大文件的场景。通过创建多个不同的文件描述符,各线程可以并行地读取或写入文件,从而减少文件读写时间,提升整体效率。
  2. 提高并发性: 文件共享提供了一种机制,使得多个进程或线程能够并发地访问同一个文件。这对于需要频繁访问文件的应用程序而言,能够充分利用系统资源,提高并发性和响应速度。
  3. 文件描述符复制: 通过多次调用open函数或使用dup()dup2()函数,可以制造出多个不同的文件描述符,这些描述符指向同一个文件。这为多个并发操作提供了独立的文件访问通道,确保彼此之间不会干扰。
  4. 协同操作: 文件共享还涉及文件锁定等机制,确保在并发访问时对文件的操作是协同进行的。这有助于避免数据不一致性和冲突,提高程序的稳定性。

下面分享常见的三种文件共享方式。

1、同一个进程中多次调用 open 函数打开同一个文件

在同一个进程中多次调用 open 函数打开同一个文件会得到多个不同的文件描述符(File Descriptor,简称FD)。每次调用 open 都会返回一个新的文件描述符,这些描述符可以独立地用于对文件的读取、写入等操作。

各数据结构之间的关系如下图所示:

下面是一个简单的例子,演示了在同一个进程中多次调用 open 打开同一个文件:

代码语言:javascript
复制
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>

int main(void) {
    // 打开同一个文件,获取文件描述符
    int fd1 = open("example.txt", O_RDONLY);
    int fd2 = open("example.txt", O_RDONLY);

    if (fd1 == -1 || fd2 == -1) {
        perror("Error opening file");
        return 1;
    }

    // 读取文件内容
    char buffer1[100];
    char buffer2[100];

    ssize_t bytesRead1 = read(fd1, buffer1, sizeof(buffer1));
    ssize_t bytesRead2 = read(fd2, buffer2, sizeof(buffer2));

    // 输出读取的内容
    printf("Content read from fd1: %.*s\n", (int)bytesRead1, buffer1);
    printf("Content read from fd2: %.*s\n", (int)bytesRead2, buffer2);

    // 关闭文件描述符
    close(fd1);
    close(fd2);

    return 0;
}

在这个例子中,程序打开同一个文件 "example.txt" 两次,分别获得了两个文件描述符 fd1fd2。这两个文件描述符可以独立地进行文件读取操作。需要注意的是,这种情况下读取的文件内容是一样的,因为它们指向同一个文件的同一位置。

2、不同进程中分别使用 open 函数打开同一个文件

在Linux系统中,不同进程可以使用open函数打开同一个文件。当多个进程打开同一个文件时,每个进程会得到一个文件描述符(file descriptor),这个文件描述符是一个唯一的整数,用于标识该文件在该进程中的打开实例。

各数据结构之间的关系如下图所示:

以下是一个简单的例子,演示了两个不同的进程分别使用open函数打开同一个文件:

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>

int main() {
    // 文件路径
    const char *file_path = "example.txt";

    // 在第一个进程中打开文件
    int fd1 = open(file_path, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
    if (fd1 == -1) {
        perror("Error opening file in process 1");
        exit(EXIT_FAILURE);
    }

    // 写入内容到文件
    const char *content1 = "Hello from process 1\n";
    write(fd1, content1, strlen(content1));

    // 关闭文件描述符
    close(fd1);

    // 在第二个进程中打开文件
    int fd2 = open(file_path, O_WRONLY | O_APPEND);
    if (fd2 == -1) {
        perror("Error opening file in process 2");
        exit(EXIT_FAILURE);
    }

    // 写入内容到文件
    const char *content2 = "Hello from process 2\n";
    write(fd2, content2, strlen(content2));

    // 关闭文件描述符
    close(fd2);

    return 0;
}

在这个例子中,两个进程分别使用open函数打开同一个文件 example.txt。第一个进程以写入模式打开文件,写入一些内容,然后关闭文件。第二个进程以追加模式打开文件,写入一些内容,然后关闭文件。由于文件描述符是每个进程私有的,它们可以独立地访问和操作同一个文件,不会相互干扰。

3、同一个进程中通过 dup(dup2)函数对文件描述符进行复制

在同一个进程中,可以使用dup函数或dup2函数来复制文件描述符。这样,进程内的两个文件描述符将指向同一个打开的文件,允许对同一文件进行独立的读写操作。

各数据结构之间的关系如下图所示:

下面是一个简单的例子:

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>

int main() {
    // 文件路径
    const char *file_path = "example.txt";

    // 打开文件
    int fd1 = open(file_path, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
    if (fd1 == -1) {
        perror("Error opening file");
        exit(EXIT_FAILURE);
    }

    // 写入内容到文件
    const char *content = "Hello from process\n";
    write(fd1, content, strlen(content));

    // 复制文件描述符
    int fd2 = dup(fd1);
    if (fd2 == -1) {
        perror("Error duplicating file descriptor");
        close(fd1);
        exit(EXIT_FAILURE);
    }

    // 使用原始文件描述符写入内容
    const char *content1 = "Original file descriptor\n";
    write(fd1, content1, strlen(content1));

    // 使用复制的文件描述符写入内容
    const char *content2 = "Duplicated file descriptor\n";
    write(fd2, content2, strlen(content2));

    // 关闭文件描述符
    close(fd1);
    close(fd2);

    return 0;
}

在这个例子中,程序先打开一个文件,然后使用dup函数复制文件描述符。这样,fd1fd2都指向同一个文件。接着,程序使用原始文件描述符 fd1 写入一些内容,再使用复制的文件描述符 fd2 写入另一些内容。由于它们指向同一个文件,两次写入的内容都会出现在文件中。

需要注意的是,dup函数会返回一个新的文件描述符,该描述符是当前可用文件描述符中的最小数值。而dup2函数则允许指定新的文件描述符的值,如果指定的文件描述符已经被占用,dup2会先关闭该描述符,然后将其重定向到指定的文件。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-05-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、同一个进程中多次调用 open 函数打开同一个文件
  • 2、不同进程中分别使用 open 函数打开同一个文件
  • 3、同一个进程中通过 dup(dup2)函数对文件描述符进行复制
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档