c++ 进程间通信 修改中间文件 访问共享内存

进程间通信:目前两个方案

方案一:通过中间文件,不打开文件前提下,判断文件修改时间

方案二:访问共享内存

实验结论,访问共享内存要快一些,但是都不会相差数量级

cpp 复制代码
#include <iostream>
#include <sys/stat.h> // For stat() function
#include <ctime>      // For time_t type
#include <chrono>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <cstring> // For strcpy function

bool isFileModified(const char *filePath, time_t &lastModifiedTime)
{
    struct stat fileStat;
    if (stat(filePath, &fileStat) != 0)
    {
        // Failed to get file status
        return false;
    }

    // Compare current modification time with the stored one
    if (lastModifiedTime != fileStat.st_mtime)
    {
        // File has been modified
        lastModifiedTime = fileStat.st_mtime;
        return true;
    }

    // File has not been modified
    return false;
}

int main()
{
    const char *filePath = "example.txt";
    time_t lastModifiedTime = 0; // Store the last modified time of the file

    auto start_mem = std::chrono::steady_clock::now();
    // Check if the file has been modified
    if (isFileModified(filePath, lastModifiedTime))
    {
        std::cout << "File has been modified." << std::endl;
    }
    else
    {
        std::cout << "File has not been modified." << std::endl;
    }

    auto end_mem = std::chrono::steady_clock::now();
    auto mem_duration = std::chrono::duration_cast<std::chrono::microseconds>(end_mem - start_mem);
    std::cout << "查看文件修改耗时: " << mem_duration.count() << " microseconds" << std::endl;
    key_t key = ftok("/tmp", 'A');
    int shm_id = shmget(key, 0, 0);
    if (shm_id == -1)
    {
        std::cerr << "Failed to get shared memory segment." << std::endl;
        return 1;
    }

    // 映射共享内存段到进程的地址空间中
    start_mem = std::chrono::steady_clock::now();
    char *shm_ptr = (char *)shmat(shm_id, NULL, 0);
    if (shm_ptr == (char *)-1)
    {
        std::cerr << "Failed to attach shared memory segment." << std::endl;
        return 1;
    }

    // 读取共享内存中的数据并打印到标准输出
    // std::cout << "Data in shared memory:" << std::endl;
    // std::cout << shm_ptr << std::endl;

    // start_mem = std::chrono::steady_clock::now();

    // 解除共享内存映射
    // shmdt(shm_ptr);

    // 删除共享内存段
    // shmctl(shm_id, IPC_RMID, NULL);

    end_mem = std::chrono::steady_clock::now();
    mem_duration = std::chrono::duration_cast<std::chrono::microseconds>(end_mem - start_mem);
    std::cout << "访问共享内存数据耗时: " << mem_duration.count() << " microseconds" << std::endl;
    std::cout << shm_ptr << std::endl;

    return 0;
}

编译

bash 复制代码
g++ test.cpp
./a.out
ipcs -m

输出结果

bash 复制代码
(base) mazu@tegra-ubuntu-s2:~/hq$ ./a.out
File has been modified.
查看文件修改耗时: 50 microseconds
访问共享内存数据耗时: 21 microseconds
Hello from shared memory!
(base) mazu@tegra-ubuntu-s2:~/hq$ ipcs -m

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status
0x411d0001 1          mazu       666        1024       0
相关推荐
沐怡旸6 小时前
【底层机制】std::string 解决的痛点?是什么?怎么实现的?怎么正确用?
c++·面试
River4169 小时前
Javer 学 c++(十三):引用篇
c++·后端
感哥12 小时前
C++ std::set
c++
侃侃_天下12 小时前
最终的信号类
开发语言·c++·算法
博笙困了13 小时前
AcWing学习——差分
c++·算法
echoarts13 小时前
Rayon Rust中的数据并行库入门教程
开发语言·其他·算法·rust
Aomnitrix13 小时前
知识管理新范式——cpolar+Wiki.js打造企业级分布式知识库
开发语言·javascript·分布式
青草地溪水旁13 小时前
设计模式(C++)详解—抽象工厂模式 (Abstract Factory)(2)
c++·设计模式·抽象工厂模式
青草地溪水旁13 小时前
设计模式(C++)详解—抽象工厂模式 (Abstract Factory)(1)
c++·设计模式·抽象工厂模式
感哥13 小时前
C++ std::vector
c++