共享内存
共享内存是被多个进程共享的一部分物理内存。共享内存是进程间共享数据的一种最快的方法,一个进程向共享内存区域写入了数据,共享这个内存的区域的所有进程就可以立刻看到其中的内容。
共享内存实现可以分为两个步骤:
Ø 创建共享内存,使用shmget函数
Ø 映射共享内存,将这段创建的共享内存映射到具体的进程空间去,使用shmat函数
创建:
int shmget (key_t key,int size,int shmflg)
key标识共享内存的键值:O/IPC_PRIVATE。当key懂得取值为IPC_PRIVATE,则函数shmget()将创建一块新的共享内存;如果key的取值为0,而参数shmflg中又设置IPC_PRIVATE这个标志,则同样会创建一块新的共享内存。
返回值:成功,返回共享内存标识符(IP)。失败返回-1.
Ø key= IPC_PRIVATE
Ø Key=0,shmflg= IPC_PRIVATE
其中一个成立就创建新内存
映射
int shmat (int shmid, char *shmaddr, int flag)
参数:
Ø Shmid:shmget函数返回的共享内存标识符(IP).
Ø Flag:决定以什么方式来决定映射的地址(通常为0)
Ø Shmaddr 这个地址可以自己指定,但当shmaddr=0时,表示由系统自动分配一个地址
返回值:成功,返回共享内存映射到进程中的地址,失败,-1。
当一个进程不再需要共享内存时,需要把它从进程地址空间中解脱。
Int shmdt (char *shmaddr)
例题:shmem.c
#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);
memset(p_addr,'\0',1024); //1024表示内存的大小,‘\0’表示1024个字节全部是结束标志,p_addr表示地址
strncpy(p_addr,argv[1],1024); //1024表示内存大小 argv[1]中的内存拷贝到 //p_addr中
wait(NULL); // 释放资源,不关心终止状态
exit(0);
}
else // 子进程读
{
sleep(1); // 暂停1秒 防止子进程先运行
c_addr=shmat(shmid,0,0);
printf("Client get %s\n",c_addr);
exit(0);
}
}
运行:
# ./shmem 1234
# Client get 1234