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
相关推荐
枕星而眠21 小时前
C++ STL Map容器完全指南:从有序红黑树到无序哈希表
java·开发语言
爱吃牛肉的大老虎1 天前
Rust对象之结构体,枚举,特性
开发语言·后端·rust
bbq粉刷匠1 天前
HashMap 底层原理深度拆解(二):putVal 完整链路解析(懒加载 · 链表遍历 · 尾插法)
java·开发语言·哈希算法
迷途之人不知返1 天前
lambda表达式
c++
@三十一Y1 天前
C++:红黑树的实现
开发语言·c++
_wyt0011 天前
拓扑排序:有向无环图的排队艺术
c++·拓扑排序·队列
皓月斯语1 天前
B2118 验证子串
c++·题解
乐观勇敢坚强的老彭1 天前
C++信奥:开关门、开关灯问题
开发语言·c++·算法
冻柠檬飞冰走茶1 天前
PTA基础编程题目集 7-31 字符串循环左移(C语言实现)
c语言·开发语言·数据结构·算法
a1117761 天前
中文优先的企业 RAG 知识库 开源项目
开发语言·开源·kotlin