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

Linux下共享内存简单程序示例

2014-11-25 17:08 351 查看
 共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式。两个不同进程A、B共享内存的意思是,同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新,反之亦然。由于多个进程共享同一块内存区域,必然需要某种同步机制,互斥锁和信号量都可以。采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝。因此,采用共享内存的通信方式效率是非常高的。

简单程序示例:

/*write.c*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <unistd.h>
#include <string.h>
#include "data.h"

#define BUFLEN 1024

int main(int argc, char **argv)
{
int shmid;
key_t shmkey;
char *shmptr;
Student *std;
shmkey = ftok("./client.c", 1);
shmid = shmget(shmkey, BUFLEN, 0666|IPC_CREAT);//创建共享内存块
if (shmid == -1)
{
printf("shmget failed!\n");
exit(1);
}
shmptr = (char*)shmat(shmid, NULL, 0);//映射到本地进程地址
if ((int)shmptr == -1)
{
printf("shmat failed!\n");
exit(1);
}

std = (Student*)shmptr;
memset(std, 0, sizeof(Student));
printf("input age and name:\n");
scanf("%d %s", &std->age, std->name);
return 0;
}

/*read.c*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <unistd.h>
#include "data.h"

#define BUFLEN 1024

int main(int argc, char **argv)
{
int shmid;
key_t shmkey;
char *shmptr;
Student *std;
shmkey = ftok("./client.c", 1);
shmid = shmget(shmkey, BUFLEN, 0666|IPC_CREAT);//创建共享内存块
if (shmid == -1)
{
printf("shmget failed!\n");
exit(1);
}
shmptr = (char*)shmat(shmid, NULL, 0);//映射到本地进程地址
if ((int)shmptr == -1)
{
printf("shmat failed!\n");
exit(1);
}
std = (Student*)shmptr;
printf("%d,%s\n", std->age, std->name);
shmdt(shmptr);//删除映射
shmctl(shmid, IPC_RMID, NULL);//删除共享内存块
return 0;
}

#makefile
CC = gcc
CFLAGS = -Wall -g
TARGET = write read

all:$(TARGET)
write:write.o
$(CC) $(CFLAGS) -o $@ $^
read:read.o
$(CC) $(CFLAGS) -o $@ $^
%.o:%.c
$(CC) $(CFLAGS) -c -o $@ $<
.PHONE:clean
clean:
rm -f *.o $(TARGET)

/*data.h*/
#ifndef _DATA_H_
#define _DATA_H_

#define SIZE 20
typedef struct/*共享内存数据结构*/
{
int age;
char name[SIZE];
}Student;

#endif




调试的时候先运行write,写内存,然后再运行read读取。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  gcc c 共享内存 通信