进程间通信:共享内存

Posted mbf330

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了进程间通信:共享内存相关的知识,希望对你有一定的参考价值。

共享内存

共享内存是最快的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会继续打印之前读到的字符串。

以上是关于进程间通信:共享内存的主要内容,如果未能解决你的问题,请参考以下文章

进程间通信IPC之--共享内存

Linux——进程间通信——管道与共享内存

Linux——进程间通信——管道与共享内存

五十进程间通信——System V IPC 之共享内存

Linux 进程间通信 共享内存

Linux进程间通信--进程,信号,管道,消息队列,信号量,共享内存