linux 进程间共享内存示例

写入端:

复制代码
#include <iostream>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/shm.h>
using namespace std;

struct MappingDataType {
    int mappingData;
};

bool SetUsedPID(string mappingName)
{
    void *shm = NULL;
    MappingDataType *shared;
    int shmid = shmget((key_t)1234, sizeof(MappingDataType), 0666|IPC_CREAT);
    if(shmid == -1)
    {
        fprintf(stderr, "shmget failed\n");
        return false;
    }

    shm = shmat(shmid, 0, 0);

    if(shm == (void*)-1)
    {
        fprintf(stderr, "shmat failed\n");
        return false;
    }

    shared = (MappingDataType*)shm;
    shared->mappingData = ::getpid();

    /*if(shmdt(shm) == -1)
    {
        fprintf(stderr, "shmdt failed\n");
        return false;
    }

    if(shmctl(shmid, IPC_RMID, 0) == -1)
    {
        fprintf(stderr, "shmctl(IPC_RMID) failed\n");
        return false;
    }*/

    return true;
}

int main(int argc, char *argv[])
{
    bool result = SetUsedPID("abc");
    //打断点,运行读取端
    cout << result << endl;
    return 0;
}
复制代码

读取端:

复制代码
#include <iostream>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/shm.h>
using namespace std;

struct MappingDataType {
    int mappingData;
};

int GetUsedPID(string mappingName)
{
    void *shm = NULL;
    MappingDataType *shared;

    int shmid = shmget((key_t)1234, sizeof(MappingDataType), 0666 | IPC_CREAT);

    if (shmid == -1)
    {
        fprintf(stderr, "shmget failed\n");
        return 0;
    }

    shm = shmat(shmid, 0, 0);

    if (shm == (void*)-1)
    {
        fprintf(stderr, "shmat failed\n");
        return 0;
    }

    shared = (struct MappingDataType*)shm;
    int pid = shared->mappingData;
    
    if (shmdt(shm) == -1)
    {
        fprintf(stderr, "shmdt failed\n");
    }

    if (shmctl(shmid, IPC_RMID, 0) == -1)
    {
        fprintf(stderr, "shmctl(IPC_RMID) failed\n");
    }
    
    return pid;
}

int main(int argc, char *argv[])
{
    int pid = GetUsedPID("abc");

    cout << pid << endl;    //<================= Put a breakpoint here
    return 0;
}
复制代码

 

posted on   空明流光  阅读(343)  评论(0编辑  收藏  举报

编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
历史上的今天:
2017-11-05 C# EasyHook MessageBox 示例(极简而全)
2013-11-05 webbrowser在不同的.netframework版本差异

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示