进程间通信—共享内存

makefile

 1 .PHONY:all
  2 all:client server
  3 client:client.c comm.c
  4     gcc -o $@ $^
  5 server:server.c comm.c
  6     gcc -o $@ $^
  7 
  8 .PHONY:clean
  9 clean:
 10     rm -f client server      

头文件

1 #ifndef __COMM_H__
  2 #define __COMM_H__
  3 
  4 #include<stdio.h>
  5 #include<sys/types.h>                                                                                                                                                                      
  6 #include<sys/ipc.h>
  7 #define PATHNAME "."
  8 #define PROJ_ID 0X6666
  9 int creatShm(int size);
 10 int getShm(int size);
 11 int destoryShm(int shmid);
 12 
 13 #endif //__COMM_H__
 14 
~             

用户文件

1 #include"comm.h"
  2 int main ()
  3 {
  4   int shmid=getShm(0);
  5   char * addr=(char *)shmat(shmid,NULL,0);//第二个地址为空,表示由系统为我们选择地址
  6   int i=0;
  7   for(;i<26;)
  8   {
  9     addr[i]='A'+i;
 10     i++;
 11     sleep(1);                                                                                                                                                                              
 12     addr[i]=0;
 13   }
 14   shmdt(shmid);
 15   return  0;
 16 }

服务器文件

 1 #include"comm.h"
  2 int main ()
  3 {
  4 
  5 int shmid=creatShm(4097);
  6   char * addr=(char *)shmat(shmid,NULL,0);//第二个地址为空,表示由系统为我们选择地址
  7   while(1)
  8   {
  9    printf("%s\n",addr);
 10    sleep(1);                                                                                                                                                                               
 11   }
 12   shmdt(addr);
 13 destoryShm(shmid);
 14 
 15   return 0;
 16 }
~           


函数文件

  1 #include"comm.h"
  2 
  3 static int commShm(int size,int flag)
  4 {
  5   key_t  _key=ftok(PATHNAME,PROJ_ID);
  6   if(_key<0)
  7   {
  8     perror("ftok");
  9     return -1;
 10   }
 11   int shmid=shmget(_key,size,flag);                                                                                                                                                        
 12   if(shmid<0)
 13   {
 14      perror("shmget");
 15      return -2;
 16   }
 17   return shmid;
 18 }
 19 
 20 int creatShm(int size)
 21 {
 22 
 23 return  commShm(size,IPC_CREAT|IPC_EXCL|0666);
 24 }
 25 int getShm(int size)
 26 {
 27 return  commShm(size,IPC_CREAT);
 28 }
 29 int destoryShm(int  shmid)
 30 {
 31   if(shmctl(shmid,IPC_RMID,NULL)<0)
 32   {
 33    perror("shmctl");
 34    return -1;
 35  } 
 36 }
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值