Linux下共享内存简单程序示例
2014-11-25 17:08
351 查看
共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式。两个不同进程A、B共享内存的意思是,同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新,反之亦然。由于多个进程共享同一块内存区域,必然需要某种同步机制,互斥锁和信号量都可以。采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝。因此,采用共享内存的通信方式效率是非常高的。
简单程序示例:
调试的时候先运行write,写内存,然后再运行read读取。
简单程序示例:
/*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读取。
相关文章推荐
- linux两个程序通过共享内存通信的一个简单例子
- linux两个程序通过共享内存通信的一个简单例子
- Linux下基于POSIX标准的共享内存操作示例
- Linux下基于POSIX标准的共享内存操作示例
- Linux C程序练习(4)进程通信之信号量、共享内存
- Linux共享内存示例,使用信号量同步
- linux操作系统修改共享内存的简单方法
- Linux网络编程--使用epoll,共享内存技术实现高性能的聊天室程序
- Linux下基于POSIX标准的共享内存操作示例
- Linux 下监控程序 -- 共享内存通讯,消息订阅发布
- Linux下基于POSIX标准的共享内存操作示例
- linux下共享内存(shm)使用示例
- Linux(RedHat) 中多平台之间的文件共享简单示例
- LINUX 64位下运行32位程序加载和读取大数据段共享内存
- linux下的简单共享内存map实现
- Eclipse中使用Hadoop伪分布模式开发配置及简单程序示例(Linux下)
- Linux Socket 事件触发模型 epoll 示例 这里会写一个用C语言的TCP服务器的完全实现的简单程序
- linux进程共享内存通信示例
- Linux下基于POSIX标准的共享内存操作示例
- Linux(RedHat) 中多平台之间的文件共享简单示例