进程间通信之共享内存

来源:互联网 发布:新装系统无法连接网络 编辑:程序博客网 时间:2024/06/05 20:29

共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。但没有同步与互斥机制,所以往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。

生命周期:随内核。

共享内存实现机制:在物理内存上申请一块空间,再在页表上添加映射信息,把信息映射到地址空间上,将申请的内存地址的虚拟地址给tast_struct。如图所示:

图示中shm:即为共享内存。大小为4096(4k)的整数倍。shm位于堆栈之间。


实现的相关代码:

comm.h:
#ifndef _COMM_H
#define _COMM_H
#include<stdio.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<stdlib.h>
#define PATHNAME "."
#define PROJ_ID 0666
int create_shm(size_t size);
int get_shm();
int destroy_shm(int shmid);
#endif
comm.c:
#include"comm.h"
static int comm_shm(size_t size,int flags)
{
key_t key = ftok(PATHNAME,PROJ_ID);
//if(key< 0)
//{
//perror("ftok");
//return -1;
//}
int shmid=shmget(key,size,flags);
if(shmid<0)
{
perror("shmget");
}
return shmid;
}
int create_shm(size_t size)
{
return comm_shm(size,IPC_CREAT|IPC_EXCL|0666);
}
int get_shm()
{
return comm_shm(0,IPC_CREAT);
}
int destroy_shm(int shmid)
{
if(shmctl(shmid,IPC_RMID,NULL)<0)
{
perror("shmctl");
return -1;
}
return 0;
}
server.c:
#include"comm.h"
int main()
{
printf("i am a server\n");
int shmid=create_shm(4096);
char *buf=shmat(shmid,NULL,0);
int idx = 0;
while(idx<4096)
{
buf[idx]='A'+idx%26;
sleep(1);
idx++;
}
shmdt(buf);
destroy_shm(shmid);
return 0;
}
client.c:
#include"comm.h"
int main()
{
int shmid=get_shm();
char *buf=shmat(shmid,NULL,0);
while(1)
{
printf("%s\n",buf);
sleep(1);
}
shmdt(buf);
return 0;
}
Makefile:
.PHONY:all
all:server client
server:comm.c server.c
gcc -o $@ $^
client:comm.c client.c
gcc -o $@ $^
.PHONY:clean
clean:
rm -f server client
2 0
原创粉丝点击