您的位置:首页 > 运维架构 > Linux

Linux shared Memory的写入与读取

2017-06-01 23:18 465 查看

作用

  多个进程就可以访问相同的物理存储,以此实现多进程通信。

特点

  提供了进程间共享数据的最快途径

  不在读写数据之间提供任何同步方法

常用的函数

shmget函数用于创建/打开一个共享存储段
int shmget(key_t key, size_t size, int shmflg);

调用shmat函数来连接这个共享段到自己的地址空间

void *shmat(int shmid, void *shmaddr, int shmflg);

使用shmdt函数将它从进程地址空间分离

int shmdt(void *shmaddr);

写入与读取操作:

服务程序和客户程序共享一个存储段,服务程序创建共享存储段并写入信息等待回馈,客户程序接收信息并重写共享存储段并分离,服务程序接收客户发的信息并退出。

server.c

#include<sys/shm.h>
#include<stdio.h>
#include<stdlib.h>
void main(){
char c[18] = "Hello, I am server";
int shmid;
key_t key = 56789;
char *shm, *s;
shmid = shmget(key, 20, IPC_CREAT|0666);//创建并赋权限(所有用户都可读写)
if( shmid == -1){
printf("Error: create shared Memory");
exit(0);
}
shm = shmat(shmid, NULL, 0);
if( shm == -1){
printf("Error: connect shared Memory");
exit(0);
}
s = shm;
for(int i=0; i<18; i++){
*s = c[i];
s++;
}
*s = NULL;
while(*shm != '*'){
printf("Waiting...\nThe shared Memory is :");
for(s = shm; *s != NULL; s++){
if(*s =='*'){
putchar('\n');
exit(0);
}
putchar( *s );
}
sleep(1);
putchar('\n');
}
}
client.c
#include<sys/shm.h>
#include<stdio.h>
#include<stdlib.h>
void main(){
int shmid;
char c[15] = "Hi, I am client";
key_t key = 56789;
char *shm, *s;
shmid = shmget(key, 0, 0666);
if( shmid == -1){
printf("Error: create shared Memory");
exit(0);
}
shm = shmat(shmid, NULL, 0);
if( shm == -1){
printf("Error: connect shared Memory");
exit(0);
}
for(s = shm; *s != NULL; s++){
putchar( *s );
}
putchar('\n');
for(int i=0; i<16; i++){
if( i == 15){
*shm = '*';
}else{
*shm = c[i];
shm++;
}
}
shmdt( shm );//分离共享存储段
exit(0);
}运行步骤:
gcc server.c -o server

gcc client.c -o client

./server

重开一个命令行

./client



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: