可以说,共享内存是一种最为高效的进程间通信方式。因为进程可以直接读写内存,
不需要任何数据的拷贝。为了在多个进程间交换信息,内核专门留出了一块内存区。这段
内存区可以由需要访问的进程将其映射到自己的私有地址空间。因此,进程就可以直接读
写这一内存区而不需要进行数据的拷贝,从而大大提高了效率。当然,由于多个进程共享
一段内存,因此也需要依靠某种同步机制,如互斥锁和信号量等.
共享内存的实现分为两个步骤,第一步是创建共享内存,这里用到的函数是shmget,也
就是从内存中获得一段共享内存区域。第二步映射共享内存,也就是把这段创建的共享内存
映射到具体的进程空间去,这里使用的函数是shmat。到这里,就可以使用这段共享内存了,
也就是可以使用不带缓冲的I/O 读写命令对其进行操作。除此之外,当然还有撤销映射的操
作,其函数为shmdt.
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define PERM S_IRUSR|S_IWUSR
/* 共享内存 */
int main(int argc,char **argv)
{
int shmid;
char *p_addr,*c_addr;
if(argc!=2)
{
fprintf(stderr,"Usage:%s\n\a",argv[0]);
exit(1);
}
/* 创建共享内存 */
if((shmid=shmget(IPC_PRIVATE,1024,PERM))==-1)
{
fprintf(stderr,"Create Share Memory Error:%s\n\a",strerror(errno));
exit(1);
}
/* 创建子进程 */
if(fork()) // 父进程写
{
p_addr=shmat(shmid,0,0); //第二个0为系统自动指定;
memset(p_addr,'\0',1024);
strncpy(p_addr,argv[1],1024);
wait(NULL); // 释放资源,不关心终止状态
shmdt(p_addr);
exit(0);
}
else // 子进程读
{
sleep(1); // 暂停1秒
c_addr=shmat(shmid,0,0); //第二个0为系统自动指定;
printf("Client get %s\n",c_addr);
exit(0);
}
}
阅读(669) | 评论(0) | 转发(1) |