进程通讯之共享内存实例
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++封装
写共享内存实例:
#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++封装
相关文章推荐
- 进程间通讯之内存共享(实例)
- (4)linux进程通讯之共享内存
- 进程间通讯——共享内存
- Linux进程间通讯之共享内存
- 进程间通讯之共享内存
- 多线程进程间通讯共享内存(Shared Memory with IPC with threads)
- WIN32 进程间通讯-共享内存
- Linux 进程间通讯之共享内存方式
- Linux进程间通讯五--共享内存
- 进程间通讯----消息队列和共享内存方式的实现
- 进程间通讯 —— 共享内存
- linux 进程间通讯-共享内存
- 进程间通讯-共享内存2(代码)
- 进程间通讯的消息队列和共享内存方式的实现
- linux进程通讯-共享内存
- 利用共享内存实现进程之间的通讯
- linux进程通讯-共享内存1
- 进程间通讯:共享内存
- 进程间通讯-共享内存
- Linux进程通讯:管道通讯、信号通讯、共享内存