溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

進(jìn)程通信之共享內(nèi)存

發(fā)布時間:2020-07-24 12:34:45 來源:網(wǎng)絡(luò) 閱讀:366 作者:小止1995 欄目:編程語言

共享內(nèi)存是進(jìn)程間通信方式中效率最高的,由內(nèi)核創(chuàng)建,少了兩次拷貝,直接操作共享內(nèi)存。

優(yōu)點(diǎn):高效。

缺點(diǎn):不提供同步與互斥。

 //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

實(shí)驗(yàn)結(jié)果:打開兩個終端

進(jìn)程通信之共享內(nèi)存

進(jìn)程通信之共享內(nèi)存

使用信號量的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


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI