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
相关推荐
烂蜻蜓41 分钟前
前端已死?什么是前端
开发语言·前端·javascript·vue.js·uni-app
老猿讲编程43 分钟前
安全C语言编码规范概述
c语言·开发语言·安全
OrangeJiuce1 小时前
【QT中的一些高级数据结构,持续更新中...】
数据结构·c++·qt
程序员-King.3 小时前
【接口封装】——13、登录窗口的标题栏内容设置
c++·qt
萌の鱼4 小时前
leetcode 2826. 将三个组排序
数据结构·c++·算法·leetcode
Biomamba生信基地4 小时前
两天入门R语言,周末开讲
开发语言·r语言·生信
RAN_PAND4 小时前
STL介绍1:vector、pair、string、queue、map
开发语言·c++·算法
Bio Coder4 小时前
R语言安装生物信息数据库包
开发语言·数据库·r语言
Tiger Z4 小时前
R 语言科研绘图第 27 期 --- 密度图-分组
开发语言·程序人生·r语言·贴图