共享內存是進程間通信方式中效率最高的,由內核創建,少了兩次拷貝,直接操作共享內存。
優點:高效。
缺點:不提供同步與互斥。
//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
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。