进程通信之共享内存
共享内存是进程间通信方式中效率最高的,由内核创建,少了两次拷贝,直接操作共享内存。
优点:高效。
缺点:不提供同步与互斥。
//comm.h1#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_0x75710#define_SIZE_4*102411staticintshm(size_tsize,intflags);12intcreat_shm(size_tsize);13intget_shm(size_tsize);14void*at_shm(intshm_id);15intdt_shm(constvoid*shmadd);16intdestory_shm(intshm_id);//comm.c1#include"comm.h"2staticint_shm(size_tsize,intflags)3{4key_t_key=ftok(_PATH_,_PROJ_ID_);5if(_key<0)6{7perror("ftok");8return-1;9}10intshm_id=shmget(_key,size,flags);11if(shm_id<0)12{13perror("shmget");14return-1;15}16returnshm_id;17}18intcreat_shm(size_tsize)19{20return_shm(size,IPC_CREAT|IPC_EXCL|0666);21}22intget_shm(size_tsize)23{24return_shm(size,IPC_CREAT);25}26void*at_shm(intshm_id)27{28returnshmat(shm_id,NULL,0);29}30intdt_shm(constvoid*shmadd)31{32returnshmdt(shmadd);33}34intdestory_shm(intshm_id)35{36if(shmctl(shm_id,IPC_RMID,NULL)<0)37{38perror("shmctl");39return-1;40}41return0;42}//server.c1#include"comm.h"2intmain()3{4intshm_id=creat_shm(_SIZE_);5char*buf=(char*)at_shm(shm_id);6//memset(buf,'\0',_SIZE_);7while(1)8{9printf("%s\n",buf);10sleep(1);11}12dt_shm(buf);13destory(buf);14}//client.c1#include"comm.h"2intmain()3{4intshm_id=get_shm(_SIZE_);5if(shm_id<0)6{7printf("get_shmerror\n");8return-1;9}10char*buf=(char*)at_shm(shm_id);11memset(buf,'\0',_SIZE_);12inti=0;13while(i<_SIZE_-1)14{15sleep(1);16buf[i++]='A';17}18dt_shm(buf);19return0;20}//Makefile1.PHONY:all2all:serverclient3server:server.ccomm.c4gcc-o$@$^5client:client.ccomm.c6gcc-o$@$^7.PHONY:clean8clean:9rm-fserverclient
实验结果:打开两个终端
使用信号量的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:all2all:serverclient3server:server.ccom.c4gcc-o$@$^-I./lib-L./lib-lmysem5client:client.ccom.c6gcc-o$@$^-I./lib-L./lib-lmysem7.PHONY:clean8clean:9rm-fserverclient
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。