一.共享内存:
共享内存:是被多个进程共享的一部分物理内存。
共享内存是进程间共享数据的一种最快的方式;
一个进程向共享内存区域写入了数据,共享这个内存区域的所有进程就可以立即看到其中的内容。
二.共享内存的实现:
共享内存的实现分为两个步骤
(1) 创建共享内存,使用shmget函数。
(2) 映射共享内存,将这段创建的共享映射到具体的进程空间去,使用shmat函数
A.创建:
int shmget(key_t key , int size ,int shmflg)
(shmget:获取共享内存)
key标识共享内存的键值:0 / IPC_PRIVATE.
当key的取值为IPC_PRIVATE,则函数shmget()将创建一块新的共享内存;如果key的取值为0,而参数shmflg中又设置IPC_PRIVATE这个标志,则同样会创建一块新的共享内存。
返回值:如果成功,返回共享内存标识符;如果失败,返回-1;
B、映射
int shmat(int shmid ,char *shmaddr ,int flag)
(shmat:连接共享内存)
参数:
(1) shmid :shmget函数返回的个共享存储标识符;
(2) shmaddr :一般为0;(表示有系统帮你找一个地址)
(3) flag :决定以什么方式来确定映射的地址(通常为0)
返回值:如果成功,则返回共享内存映射到的进程的地址;
如果失败,则返回-1;
当一个进程不再需要共享内存时,需要把它从进程地址空间中脱离。
Int shmdt (char *shmaddr)
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#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); /*把创建好的内存映射到父进程当中来,shmid:父进程的编号,第二个参数为0,即让系统自动帮找一个地址*/
/*shmat()返回值:如果成功,则返回共享内存映射到的进程的地址;
如果失败,则返回-1;*/
memset(p_addr,'\0',1024); /*让内存区全部为结束符*/
strncpy(p_addr,argv[1],1024);
wait(NULL); // 释放资源,不关心终止状态(等待子进程退出)
exit(0);
}
else // 子进程读
{
sleep(1); // 暂停1秒
c_addr=shmat(shmid,0,0);
printf("Client get %s\n",c_addr);
exit(0);
}
}