进程间通信:共享内存

共享内存

共享内存是最快的IPC形式

共享内存就是允许两个不相关的进程访问同一个虚拟内存。共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式。

共享内存函数

1.int shmget(key_t key,int shmsz,int shmflg);
Shmget()函数分配一块新的共享内存。Shmsz指明共享内存的大小,以字节为单位,shmflg的设置与信号量的semget()函数中的参数semflg类似。如果shmget()函数调用成功则返回共享内存的ID;否则返回-1.

2.void *shmat(int shmid,const void *shmaddr, int shmflg)
Shmat()函数的作用是连接共享内存与某个进程的地址空间。Shmid是shmget()函数返回的共享内存ID。Shmaddr是共享内存连接到进程中的存放地址,一般设置为空指针,表示交由系统完成这个工作。Shmflg设置共享内存的控制选项,有两个可能取值:SHM_RND(与shmaddr参数相关)与SHM_RDONLY(只读)。如果shmat()函数调用成功则返回指向共享内存的指针;否则返回-1.

3.int shmdt (const void *shmaddr)
Shmdt()函数用来解除进程与共享内存区域的关联,使当前进程不能继续访问共享内存。参数shmaddr是shmat()函数返回的指针。如果操作成功则返回0;失败则返回-1.

4.int shmctl(int shmid, int cmd,struct shmid_ds *buf)
Shmctl()函数实现对共享内存区域的控制操作。其用法与消息队列的msgctl()函数类似。

共享内存代码实现

此段代码由client(用户端)向server(服务器端)发送信息;在服务器端打印出来。
server(服务器端)

int main()
{
  //获取ipc通讯指定ID
  key_t k = ftok(PATHNAME,PROJ_ID);
  printf("key: %p\n",k);
  //创建共享内存                                                       
  int shmid = shmget(k,SIZE,IPC_CREAT|0666);
  //创建失败则抛异常
  if(shmid<0)
  {
    perror("shmget error!\n");
    return 1;
  }
  //打印shmid
  printf("shmid:%d\n",shmid);
  //连接共享内存与进程的地址空间
  char *str=shmat(shmid,NULL,0);//sleep(5);
  //每隔一秒打印一次str
  while(1)
  {
    sleep(1);
    printf("%s\n",str);
  }
  //解除进程与共享内存区域的关联
  shmdt(str);
  //清空共享内存
  shmctl(shmid,IPC_RMID,NULL);//sleep(10);
  return 0;
}            

client(用户端)

#include<stdio.h>                                                      
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include"comm.h"
#include<unistd.h>
int main()
{
  key_t k = ftok(PATHNAME,PROJ_ID);
  printf("key: %p\n",k);
  //共享内存创建/使用,已在server端创建完毕,直接使用即可
  int shmid = shmget(k,SIZE,0);
  //若创建失败,则抛异常
  if(shmid<0)
  {
    perror("shmget error!\n");
    return 1;
  }
  //打印shmid
  printf("shmid:%d\n",shmid);
  //shmctl(shmid,IPC_RMID,NULL);sleep(10);
  char *str=shmat(shmid,NULL,0);sleep(1);
  char c='a';
  for(;c<='z';c++)
  {
    str[c-'a']=c;
    sleep(1);
  }
  shmdt(str);sleep(2);
  //shmctl(shmid,IPC_RMID,NULL);sleep(2);
  return 0;
}                      

每隔一秒,server端会读取client发送的字符串并打印,在client退出后, server会继续打印之前读到的字符串。
在这里插入图片描述

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值