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
相关推荐
zylyehuo1 分钟前
C++基础编程
c++
染翰18 分钟前
lua入门以及在Redis中的应用
开发语言·redis·lua
王者鳜錸28 分钟前
PYTHON让繁琐的工作自动化-函数
开发语言·python·自动化
兔老大RabbitMQ1 小时前
git pull origin master失败
java·开发语言·git
tt5555555555551 小时前
C/C++嵌入式笔试核心考点精解
c语言·开发语言·c++
xiao助阵1 小时前
python实现梅尔频率倒谱系数(MFCC) 除了傅里叶变换和离散余弦变换
开发语言·python
lg_cool_1 小时前
Qt 中最经典、最常用的多线程通信场景
c++·qt6.3
科大饭桶2 小时前
C++入门自学Day14-- Stack和Queue的自实现(适配器)
c语言·开发语言·数据结构·c++·容器
tt5555555555552 小时前
字符串与算法题详解:最长回文子串、IP 地址转换、字符串排序、蛇形矩阵与字符串加密
c++·算法·矩阵
扛麻袋的少年3 小时前
7.Kotlin的日期类
开发语言·微信·kotlin