c 共享内存demo

Posted luckygxf

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c 共享内存demo相关的知识,希望对你有一定的参考价值。

一个进程写数据,一个进程读数据

写进程:

1. shmget()获取共享内存

2. shmat()共享内存映射到进程空间

3. 写数据

读进程:

1. shmget()获取共享内存

2. shmat()共享内存映射到进程空间

3. 读数据

4. shmdt()共享内存从进程空间解除映射

5. shmctl()删除共享内存
读进程

//
// Created by gxf on 2020/2/10.
//

#ifndef UNTITLED_MAIN_H
#define UNTITLED_MAIN_H

char *ftokFilePath = "/Users/gxf/CLionProjects/untitled/main.c";
int project_id = 10;

typedef struct {
    int age;
    char name[50];
}person;

#endif //UNTITLED_MAIN_H
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <string.h>

#include "main.h"


int main() {
    key_t ftokRes = ftok(ftokFilePath, project_id);
    person *zhangsan;
    person lisi = {10, "lisi"};

    int shmid = shmget(ftokRes, sizeof(person), IPC_CREAT | 0777);
    printf("shamid :%d
", shmid);
    zhangsan = (person *)shmat(shmid, NULL, SHM_W);
    zhangsan->age = 20;
    strcpy(zhangsan->name, "zhangsan1111");


    return 0;
}
//
// Created by gxf on 2020/2/10.
//
#include <stdlib.h>
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <string.h>

#include  "main.h"

int main() {
    key_t ftokRes = ftok(ftokFilePath, project_id);
    printf("%d
", ftokRes);
    person *zhangsan = malloc(sizeof(person));
    int shmid = shmget(ftokRes, sizeof(person), IPC_CREAT);
    person *shmaddr = shmat(shmid, NULL, SHM_R);
    memcpy(zhangsan, shmaddr, sizeof(person));
    printf("age:%d, name:%s
", zhangsan->age, zhangsan->name);
    int res = shmdt(shmaddr);
    if (res)
        fprintf(stderr, "shmdt fail");
    res = shmctl(shmid, IPC_RMID, NULL);
    if (res)
        fprintf(stderr, "rm ipcs -m fail");


    return 0;
}

  

  

 

以上是关于c 共享内存demo的主要内容,如果未能解决你的问题,请参考以下文章

df 报告磁盘使用情况,但在共享内存 /dev/shm 中没有文件

简单例子windows 共享内存 Demo -----

[异常解决] Keil安装好nRF51822开发环境,运行DEMO报错:Error:“GPIOTE_CONFIG_NUM_OF_LOW_POWER_ENVENTS” is undefined(代码片段

C/C++内存分布

在不同步的情况下读写 SysV 共享内存(使用信号量、C/C++、Linux)

C中的基本共享内存程序