共享内存

共享内存:

共享存储允许两个或更多进程共享一给定的存储区。若服务器正在将数据放入共享存储区,则在它做完这一操作之前,客户进程不应当去取这些数据。通常,信号量被用来实现对共享存储访问的同步。

 

为获得一个共享存储段,调用的第一个函数通常是shmget

 

int shmget(key_t   key,size_t  size,int  flag);

类似于msgget();成功返回共享存储段标识符;出错返回-1

flag用来设置权限,如:flag=IPC_CREAT|IPC_EXCL|0777

 

 

int   shmctl(int  shmid,int  cmd,struct shmid_ds  *buf);

类似于msgctl();

shmctl(shmid,IPC_RMID,0)从系统中删除共享存储段;

 

 

一旦创建了一个共享存储段,进程就可以调用shmat()将共享存储段连接到进程的地址空间中

void    *shmat(int  shmid,const  void *addr,int  flag);

成功则返回指向共享存储的指针,若出错则返回-1.

shmat的返回值是该段所连接的实际地址,如果出错则返回-1.

 

共享存储段连接到调用进程的哪个地址上与addr参数以及在flag中是否指定SHM_RND位有关。

如果addr0,则此段连接到由内核选择的第一个可用地址上。这是推荐的使用方式。

如果addr0,并且没有指定SHM_RND,则此段连接到addr所指定的地址上。

如果addr0,并且指定了SHM_RND,则此段连接到(addr-(addr  mod  ulus  SHMLBA))所表示的地址上,SHM_RND命令的意思是取整

除非只计划在一种硬件上运行应用程序(这在当今不大可能),否则不应指定共享段所连接到的地址。所以一般指定addr0,以便由内核选择地址。

如果在flag中指定了SHM_RDONLY位,则以只读方式连接此段,否则以读写方式连接此段。

 

当对共享存储段的操作已经结束时,则调用shmdt脱离该段。注意,这并不从系统中删除其标识符以及数据结构,只是使用共享存储段所需要遵守的规则。

 

int shmdt(const void *shmaddr);

成功返回0,出错返回-1.

 

shm_rw.c ==> 讲解共享存储段的使用方法。

方法:

父进程向共享存储段里放置一个数据,放好了以后给子进程发送SIGUSR1信号让子进程从共享存储段里拿出来。

shm_rw.c

 

#include   “include.h”

 

int main()

{

    //创建共享内存段

    int shm_id=shmget(1,1024,IPC_CREAT|0777);

    if(shm_id<0)check_error(“shmget”);

   

    //将共享存储段连接到父进程的内存地址空间中,成功则返回指向共享存储段的指针

    int *addr=(int *)shmat(shm_id,0,0);

    printf(“addr=%p\n”,addr);

    pid_t   pid=fork();

    if(pid<0)check_error(“fork”);

    else    if(pid>0)

    {

        //父进程向共享内存段放数据

        *addr=10;

        wait(NULL);

    //  shmctl(shm_id,IPC_RMID,0);

    }

    else    if(pid==0)

    {

        //子进程从共享内存段里拿数据

        sleep(1);

        printf(“子进程拿到父进程放到共享内存段中的数据是:%d\n”,*addr);

    }

 

    return  0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值