本博客由个人学习撰写,如有不对的火改进的地方请留言!!

写共享内存实例:

#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>


typedef struct
{
    char name[20];
    int arg;
}MAN;

int main()
{
    int shm_id;
    int i;
    MAN *p_map = NULL;
    //创建key
    key_t key = ftok("./shm",0);
    if(key==-1)
    {
        perror("ftok error");
        exit(0);
    }
    else
    {
        printf("key=%d\n",(int)key);
    }
    shm_id = shmget(key,4096,IPC_CREAT);//一内存页
    if(shm_id==-1)
    {
        perror("shmget error");
        exit(0);
    }
    else
    {
        printf("shm_id=%d\n",shm_id);
    }
    //第二个参数为NULL表示系统自选内存
    p_map = (MAN*)shmat(shm_id,NULL,0);//将内存映射到进程中来
    if((void*)p_map == (void*)-1)
    {
        perror("shmat error");
        exit(0);
    }
    char temp='a';
    for(i = 0;i<10;i++)
    {
        temp++;
        memcpy((p_map+i)->name,&temp,1);
        (p_map+i)->arg = 10+i;
    }
    if(shmdt(p_map) == -1)
    {
        perror("detach error");
    }  
    return 0;
}
 

 

读共享内存实例:

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>


typedef struct
{
    char name[20];
    int age;
}MAN;


int main()
{
    int shm_id;
    int i;
    MAN*p_map = NULL;
    key_t key = ftok("./shm",0);
    if(key == -1)
    {
        perror("ftok error");
        exit(0);
    }
    else
    {
        printf("key=%d\n",key);
    }
    shm_id = shmget(key,4096,IPC_CREAT);
    if(shm_id == -1)
    {
        perror("shmget error");
        exit(0);
    }
    else
    {
        printf("shm_id=%d\n",shm_id);
    }
    p_map = (MAN*)shmat(shm_id,NULL,0);
    if((void*)p_map == (void*)-1)
    {
        perror("shmat error");
        exit(0);
    }

    for(i=0;i<10;i++)
    {
        printf("MAN::name:%s;",(p_map+i)->name);
        printf("MAN::arg:%d\n",(p_map+i)->age);
    }
    if(shmdt(p_map) == -1)
    {
        perror("detach error");
    }
    return 0;
}

运行结果:

key=87348
shm_id=819216
MAN::name:b;MAN::arg:10
MAN::name:c;MAN::arg:11
MAN::name:d;MAN::arg:12
MAN::name:e;MAN::arg:13
MAN::name:f;MAN::arg:14
MAN::name:g;MAN::arg:15
MAN::name:h;MAN::arg:16
MAN::name:i;MAN::arg:17
MAN::name:j;MAN::arg:18
MAN::name:k;MAN::arg:19
 

 

后续将会对以上内容进行c++封装