中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

進程通信之共享內存

發布時間:2020-07-24 12:34:45 來源:網絡 閱讀:366 作者:小止1995 欄目:編程語言

共享內存是進程間通信方式中效率最高的,由內核創建,少了兩次拷貝,直接操作共享內存。

優點:高效。

缺點:不提供同步與互斥。

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


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

永州市| 元谋县| 陇西县| 宁乡县| 磐安县| 通州区| 丹江口市| 乐至县| 鹿泉市| 马边| 漾濞| 安图县| 龙井市| 浦北县| 且末县| 高阳县| 昌图县| 界首市| 鞍山市| 襄汾县| 白银市| 陇南市| 鹤壁市| 镇江市| 崇礼县| 德江县| 周宁县| 平安县| 上思县| 江源县| 阳春市| 克山县| 垫江县| 伊金霍洛旗| 平远县| 三江| 镇江市| 鲁山县| 镇原县| 顺义区| 长乐市|