您的位置:首页 > 其它

进程通讯之共享内存实例

2013-04-09 00:44 555 查看
本博客由个人学习撰写,如有不对的火改进的地方请留言!!

写共享内存实例:

#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++封装
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息