Linux 共享内存

          共享内存是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指定的地址上;

  指定时,共享内存连接到shmaddr指定的地址向下舍入一个SHMI.BA常值(底边界地址的倍数)。
shmflg :可以指定为SHM_RDONLY(只读)或 0 (可读可写)。

此函数返回共享内存地址。错误时返回-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;

}



这就是我所理解的共享内存,希望大家指出错误和不足。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值