进程通信之共享内存

发布时间:2020-07-24 12:34:45 作者:小止1995
来源:网络 阅读:354

共享内存是进程间通信方式中效率最高的,由内核创建,少了两次拷贝,直接操作共享内存。

优点:高效。

缺点:不提供同步与互斥。

 //comm.h
  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<unistd.h>
  4 #include<sys/types.h>
  5 #include<sys/ipc.h>
  6 #include<sys/shm.h>
  7 #include<string.h>
  8 #define _PATH_ "."
  9 #define _PROJ_ID_ 0x757
 10 #define _SIZE_ 4*1024
 11 static int shm(size_t size,int flags);
 12 int creat_shm(size_t size);
 13 int get_shm(size_t size);
 14 void* at_shm(int shm_id);
 15 int dt_shm(const void* shmadd);
 16 int destory_shm(int shm_id);
 //comm.c
  1 #include"comm.h"
  2 static int _shm(size_t  size,int flags)
  3 {
  4     key_t _key=ftok(_PATH_,_PROJ_ID_);
  5     if(_key<0)
  6     {
  7         perror("ftok");
  8         return -1;
  9     }
 10     int shm_id=shmget(_key,size,flags);
 11     if(shm_id<0)
 12     {
 13         perror("shmget");
 14         return -1;
 15     }
 16     return shm_id;
 17 }
 18 int creat_shm(size_t size)
 19 {
 20     return _shm(size,IPC_CREAT|IPC_EXCL|0666);
 21 }
 22 int get_shm(size_t size)
 23 {
 24     return _shm(size,IPC_CREAT);
 25 }
 26 void* at_shm(int shm_id)
 27 {
 28     return shmat(shm_id,NULL,0);
 29 }
 30 int dt_shm(const void* shmadd)
 31 {
 32     return shmdt(shmadd);
 33 }
 34 int destory_shm(int shm_id)
 35 {
 36     if(shmctl(shm_id,IPC_RMID,NULL)<0)
 37     {
 38         perror("shmctl");
 39         return -1;
 40     }
 41     return 0;
 42 }
 //server.c
  1 #include"comm.h"
  2 int main()
  3 {
  4     int shm_id=creat_shm(_SIZE_);
  5     char* buf=(char*)at_shm(shm_id);
  6     //memset(buf,'\0',_SIZE_);
  7     while(1)
  8     {
  9         printf("%s\n",buf);
 10         sleep(1);
 11     }
 12     dt_shm(buf);
 13     destory(buf);
 14 }
 //client.c
  1 #include"comm.h"
  2 int main()
  3 {
  4     int shm_id=get_shm(_SIZE_);
  5     if(shm_id<0)
  6     {
  7         printf("get_shm error\n");
  8         return -1;
  9     }
 10     char* buf=(char*)at_shm(shm_id);
 11     memset(buf,'\0',_SIZE_);
 12     int i=0;
 13     while(i<_SIZE_-1)
 14     {
 15         sleep(1);
 16         buf[i++]='A';
 17     }
 18     dt_shm(buf);
 19     return 0;
 20 }
 //Makefile
  1 .PHONY:all
  2 all:server client
  3 server:server.c comm.c
  4     gcc -o $@ $^
  5 client:client.c comm.c
  6     gcc -o $@ $^
  7 .PHONY:clean
  8 clean:
  9     rm -f server client

实验结果:打开两个终端

进程通信之共享内存

进程通信之共享内存

使用信号量的Makefile

 cp ../2016_4_11/libmysem.a .

 cp ../2016_4_11/comm.h .

 mkdir lib

 

mkdir lib

[lxj@localhost 2016_4_14]$ cd lib

[lxj@localhost lib]$ cp ../comm.h .

[lxj@localhost lib]$ cp ../libmysem.a  .

 1 .PHONY:all
  2 all:server client
  3 server:server.c com.c
  4     gcc -o $@ $^ -I./lib -L./lib -lmysem
  5 client:client.c com.c
  6     gcc -o $@ $^ -I./lib -L./lib -lmysem
  7 .PHONY:clean
  8 clean:
  9     rm -f server client


推荐阅读:
  1. IPC之共享内存·即时通讯小程序(二)
  2. Oracle Study之案例--通过IPCS查看共享内存之“怪现象”

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

共享内存 进程通信

上一篇:怎么更好入行Java编程 Git有哪些使用技巧分享

下一篇:Redis数据类型操作(一) —— String

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》