共享内存是Linux下的多进程之间的通信方法,,这种方法通常用于一个程序的多进程间通信。关于共享内存涉及到四个函数shmget , shmat , shmdt 和 shmctl 。下面分别对四个函数进行说明。
一 创建或访问共享内存。
#include<sys/shm.h>
#include<sys/ipc.h>
int shmget (key_t key , size_t size , int shmflg );
参数简介:
key :是多个进程之间的“钥匙”,这把“钥匙”必须一致;
size :是共享内存的大小;
shmflg :是共享内存的权限;此权限涉及到的宏有IPC_CREAT , IPC_EXCL 等
如果创建成功函数返回一个新建的共享内存的标识符;如果不成功返回-1,errno储存错误原因。
二 连接共享内存
#include<sys/types.h>
#include<sys/shm.h>
void *shmat( int shmid , const void *shmaddr , int shmflg);
参数简介:
shmid :是由shmget 返回的标识符。
*shmaddr :如果是一个空指针,那么系统会替调用者选择地址(建议用此方法);
如果是非空指针,那么返回地址取决于调用者是否给shmflg 参数指定了SHM_RND(取整)。
没有指定时 ,共享内存区连接到由 shmaddr指定的地址上;
此函数返回共享内存地址。错误时返回-1
三 断开与共享内存的连接
#include<sys/shm.h>
#include<types.h>
int shmdt ( const void *shmaddr);
参数简介:
*shmaddr :是共享内存的地址。
此函数成功返回0 ,失败返回-1。
注:不删除共享内存。
四 删除共享内存
#include<sys/ipc.h>
#include<sys/shm.h>
int shmctl ( int shmid , int cmd , struct shmid_ds *buf);
参数简介:
shmid :是共享内存的标识符。
cmd :是控制命令,值有 IPC_STAT(得到共享内存的状态) ,IPC_SET(改变共享内存的状态) , IPC_RMID(删除共享内存)。
*buf :是结构体指针。 IPC_STAT 时,取得状态放在结构体中。改变状态时,用结构体指定。
此函数 成功返回 0 ,失败 返回 -1。
例题:写共享内存的方法写两个程序,实现一个程序不断输入,另一个不断输出,。
#include<stdio.h>
#include<stdlib.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<sys/stat.h>
int main (void)
{
int shmid;
int *shmddr;
//创建共享内存。得到标识符。
shmid=shmget(ftok("/etc/passwd",888),getpagesize(), IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR | S_IRGRP);
if(shmid == -1)
{
perror("shmid\n");
exit(0);
}
shmddr=shmat(shmid,0,0);//连接
if(*shmddr == -1)
{
perror("shmddr\n");
exit(0);
}
while(1)
{
scanf("%d%d",shmddr,shmddr+1);//shmddr 数字,shmddr +1 数字用来控制循环。1时输出数字shmddr的值,2时结束程序
}
return 0;
---------------------------------------------------------------------------------------------------------------------------------------------
include<stdio.h>
#include<stdlib.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<sys/stat.h>
int main(void)
{
int shmid;
int *shmddr;
shmid=shmget(ftok("/etc/passwd",888),getpagesize(), S_IRUSR | S_IWUSR | S_IRGRP);//得到标识符
if(shmid == -1)
{
perror("shmidl\n");
exit(0);
}
shmddr=shmat(shmid,0,0);//连接
if(*shmddr == -1)
{
perror("shmddr\n");
exit(0);
}
while(1)
{
if(*(shmddr+1)==1)
{
pritnf("%d\n",*shmddr);
*(shmddr+1)=0;
}
else if(*(shmddr+1)==2)
break;
}
shmdt(shmddr); //断开连接
if (( shmctl(shmid,IPC_RMID,0)) == -1) //删除共享内存
{
perror("shmctl\n");
exit(0);
}
return 0;
这就是我所理解的共享内存,希望大家指出错误和不足。