Linux进程间通信(五)

共享内存是一种高效的IPC形式,允许多个进程访问同一内存空间,通常与其他通信机制如信号量配合使用,以实现同步和互斥。通过示例代码(comm.h)展示了其应用。
摘要由CSDN通过智能技术生成

共享内存:

  使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。

示例:

comm.h

  1 #pragma once
  2 
  3 #include<stdio.h>
  4 #include<sys/ipc.h>
  5 #include<sys/shm.h>
  6 
  7 #define _PROJ_PATH_ "/tmp"
  8 #define _PROJ_ID_ 0x6666
  9 
 10 int creat_shm(int shm_size);
 11 int get_shm();
 12 int destory_shm(int shm_id);
 13 void* at(int shm_id);
 14 int dt(void*);
comm.c

  1 #include"comm.h"
  2 
  3 static int comm_shm(int shm_size,int flags)
  4 {   
  5     key_t _key=ftok(_PROJ_PATH_,_PROJ_ID_);
  6     if(_key<0)
  7     {
  8         perror("ftok");
  9         return -1;
 10     }
 11     int shm_id=shmget(_key,shm_size,flags);
 12     if(shm_id<0)
 13     {
 14         perror("shmget");
 15     }
 16     return shm_id;
 17 }
 18 int creat_shm(int shm_size)
 19 {   
 20     int flags=IPC_CREAT|IPC_EXCL|0644;
 21     return comm_shm(shm_size,flags);
 22 }
 23 int get_shm()
 24 {
 25     int flags=IPC_CREAT;
 26     return comm_shm(0,flags);
 27 }
 28 void* at(int shm_id)
 29 {
 30     return shmat(shm_id,NULL,0);
 31 }
 32 int dt(void* addr)
 33 {
 34     return shmdt(addr);
 35 }
 36 int destory_shm(int shm_id)
 37 {
 38     if(shmctl(shm_id,IPC_RMID,NULL)<0)
 39     {
 40         perror("shmctl");
 41         return -1;
 42     }
 43     return 0;
 44 }
server.c

  1 #include"comm.h"
  2 int main()
  3 {
  4     int shm_id=creat_shm(4097);
  5     char* addr=at(shm_id);
  6     int done=0;
  7     while(!done)
  8     {
  9         printf("%s\n",addr);
 10         sleep(1);
 11     }
 12     dt(addr);
 13     destory_shm(shm_id);
 14     return 0;
 15 }
client.c

  1 #include"comm.h"
  2 
  3 int main()
  4 {
  5     int shm_id=get_shm();
  6     char *addr=at(shm_id);
  7 
  8     int done=0;
  9     int i=0;
 10     while(!done)
 11     {
 12         addr[i++]='A';
 13         addr[i]='\0';
 14         sleep(1);
 15     }
 16     dt(addr);
 17     return 0;
 18 }
运行结果






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值