共享内存 进程通信
2011-12-14 13:10
351 查看
参考地址:http://www.ibm.com/developerworks/cn/linux/l-ipc/part5/index1.html?ca=drs-
main.c
client.c
Makefile
分别把两个程序编译成可执行文件map_normalfile1和map_normalfile2后,在一个终端上先运行./map_normalfile2 /tmp/test_shm,程序输出结果如下:
在map_normalfile1输出initialize over 之后,输出umap ok之前,在另一个终端上运行map_normalfile2 /tmp/test_shm,将会产生如下输出(为了节省空间,输出结果为稍作整理后的结果):
在map_normalfile1 输出umap ok后,运行map_normalfile2则输出如下结果:
main.c
/*-------------map_normalfile1.c-----------*/ #include <sys/mman.h> #include <sys/types.h> #include <fcntl.h> #include <unistd.h> typedef struct{ char name[4]; int age; }people; main(int argc, char** argv) // map a normal file as shared mem: { int fd,i; people *p_map; char temp; fd=open(argv[1],O_CREAT|O_RDWR|O_TRUNC,00777); lseek(fd,sizeof(people)*5-1,SEEK_SET); write(fd,"",1); p_map = (people*) mmap( NULL,sizeof(people)*10,PROT_READ|PROT_WRITE, MAP_SHARED,fd,0 ); close( fd ); temp = 'a'; for(i=0; i<10; i++) { temp += 1; memcpy( ( *(p_map+i) ).name, &temp,2 ); ( *(p_map+i) ).age = 20+i; } printf(" initialize over \n "); sleep(10); munmap( p_map, sizeof(people)*10 ); printf( "umap ok \n" ); }
client.c
/*-------------map_normalfile2.c-----------*/ #include <sys/mman.h> #include <sys/types.h> #include <fcntl.h> #include <unistd.h> typedef struct{ char name[4]; int age; }people; main(int argc, char** argv) // map a normal file as shared mem: { int fd,i; people *p_map; fd=open( argv[1],O_CREAT|O_RDWR,00777 ); p_map = (people*)mmap(NULL,sizeof(people)*10,PROT_READ|PROT_WRITE, MAP_SHARED,fd,0); for(i = 0;i<10;i++) { printf( "name: %s age %d;\n",(*(p_map+i)).name, (*(p_map+i)).age ); } munmap( p_map,sizeof(people)*10 ); }
Makefile
all:main main: gcc -g -Wall -O0 main.c -o main client: gcc -g -Wall -O0 client.c -o client clean: rm *.o main client
分别把两个程序编译成可执行文件map_normalfile1和map_normalfile2后,在一个终端上先运行./map_normalfile2 /tmp/test_shm,程序输出结果如下:
initialize over umap ok |
name: b age 20; name: c age 21; name: d age 22; name: e age 23; name: f age 24; name: g age 25; name: h age 26; name: I age 27; name: j age 28; name: k age 29; |
name: b age 20; name: c age 21; name: d age 22; name: e age 23; name: f age 24; name: age 0; name: age 0; name: age 0; name: age 0; name: age 0; |
相关文章推荐
- 父子进程通信的两种方式--消息队列和共享内存
- C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped
- 进程通信之共享内存
- linux进程间共享内存通信详解
- linux进程通信----共享内存
- 进程间的通信方式--信号、管道、消息队列、共享内存
- Linux下进程通信之共享内存
- C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转
- windows编程之进程通信:内存共享
- Linux进程间的通信方式:共享内存的使用
- linux进程通信之共享内存
- 操作系统 进程间的通信 之 信号 消息队列 共享内存 浅析
- Windows进程通信——共享内存
- linux进程通信--共享内存
- Linux进程通信--共享内存
- Linux进程通信之共享内存
- LINUX_C编程实战-《进程间的通信》-共享内存
- 进程间的通信---共享内存
- linux 进程间的通信(五) 共享内存-2
- 通过共享内存和信号量实现进程间的通信