您的位置:首页 > 其它

进程通信之共享内存

2016-04-15 13:11 363 查看
共享内存是进程间通信方式中效率最高的,由内核创建,少了两次拷贝,直接操作共享内存。
优点:高效。
缺点:不提供同步与互斥。
//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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息