Linux进程间通信——IPC共享内存学习笔记

时间:2021-08-28 17:03:56

一、什么是共享内存
共享内存就是允许两个不相关的进程访问同一个逻辑内存。共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常安排为同一段物理内存。进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,就好像它们是由用C语言函数malloc分配的内存一样。而如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段共享内存的任何其他进程。(此处节选于网络)

int shmget(key_t key, size_t size, int shmflg);//创建共享内存函数

第一个参数,key如果是IPC_PRIVATE表示创建一个新的共享内存;
第二个参数,size以字节为单位指定需要共享的内存容量;
第三个参数,shmflg为读写的权限,例如0666代表root,user,other都具有读写的权限;

void *shmat(int shmid, const void *shmaddr, int shmflg);//附加到共享内存区

第一个参数,shm_id是由shmget函数返回的共享内存标识。
第二个参数,shm_addr指定共享内存连接到当前进程中的地址位置,通常为空,表示让系统来选择共享内存的地址。
第三个参数,shm_flg是一组标志位,通常为0。

int shmdt(const void *shmaddr);//将共享内存从调用的进程的地址空间分离

参数shmaddr是shmat函数返回的地址指针,调用成功时返回0,失败时返回-1.

下面以一道例题来加深对共享内存的理解
1、编写两个进程a和b,利用共享内存技术,a向共享内存写字符串,b将从共享内存中读到的字符串在屏幕上打印出来。

/* create_mem.c */

#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/shm.h>

int main(int arg,char *args[])
{
int shmid=shmget(IPC_PRIVATE,1024,0666);//建立共享内存区
if(shmid<0)
{
printf("failed\n");
}
else
{
printf("success\n");
}
return 0;
}
/*write_mem.c*/

#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <unistd.h>

int main(int arg,char *args[])
{
char *shmbuf=NULL;
int shmid=0;
if(arg>1)
{
shmid=atoi(args[1]);
shmbuf=shmat(shmid,0,0);//附加到共享内存区
while(1)
{
scanf("%s\n", shmbuf);;//从键盘键入的字符串写入到共享内存中
}
shmdt(shmbuf);//将共享内存从调用的进程的地址空间分离
}

return 0;
}


/*read_mem.c*/

#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#include <sys/ipc.h>
#include <sys/shm.h>

int main(int arg, char *args[])
{
int shmid = 0;
char *shmbuf = NULL;
if (arg > 1)
{
shmid = atoi(args[1]);
shmbuf = shmat(shmid, 0, 0); //附加到共享内存区
while (1)
{
printf("%s\n", shmbuf); //从共享内存读取内容并打印
if (strncmp("exit", shmbuf, 4) == 0) //如果共享内存字符串为"exit",程序退出
break;
sleep(1);
}
}
shmdt(shmbuf); //将共享内存从调用进程的地址空间分离出
return 0;
}

ipcs -m 命令可以查询系统中的共享内存
Linux进程间通信——IPC共享内存学习笔记

结果:
Linux进程间通信——IPC共享内存学习笔记

Linux进程间通信——IPC共享内存学习笔记