makefile
1 .PHONY:all
2 all:client server
3 client:client.c comm.c
4 gcc -o $@ $^
5 server:server.c comm.c
6 gcc -o $@ $^
7
8 .PHONY:clean
9 clean:
10 rm -f client server
头文件
1 #ifndef __COMM_H__
2 #define __COMM_H__
3
4 #include<stdio.h>
5 #include<sys/types.h>
6 #include<sys/ipc.h>
7 #define PATHNAME "."
8 #define PROJ_ID 0X6666
9 int creatShm(int size);
10 int getShm(int size);
11 int destoryShm(int shmid);
12
13 #endif //__COMM_H__
14
~
用户文件
1 #include"comm.h"
2 int main ()
3 {
4 int shmid=getShm(0);
5 char * addr=(char *)shmat(shmid,NULL,0);//第二个地址为空,表示由系统为我们选择地址
6 int i=0;
7 for(;i<26;)
8 {
9 addr[i]='A'+i;
10 i++;
11 sleep(1);
12 addr[i]=0;
13 }
14 shmdt(shmid);
15 return 0;
16 }
服务器文件
1 #include"comm.h"
2 int main ()
3 {
4
5 int shmid=creatShm(4097);
6 char * addr=(char *)shmat(shmid,NULL,0);//第二个地址为空,表示由系统为我们选择地址
7 while(1)
8 {
9 printf("%s\n",addr);
10 sleep(1);
11 }
12 shmdt(addr);
13 destoryShm(shmid);
14
15 return 0;
16 }
~
函数文件
1 #include"comm.h"
2
3 static int commShm(int size,int flag)
4 {
5 key_t _key=ftok(PATHNAME,PROJ_ID);
6 if(_key<0)
7 {
8 perror("ftok");
9 return -1;
10 }
11 int shmid=shmget(_key,size,flag);
12 if(shmid<0)
13 {
14 perror("shmget");
15 return -2;
16 }
17 return shmid;
18 }
19
20 int creatShm(int size)
21 {
22
23 return commShm(size,IPC_CREAT|IPC_EXCL|0666);
24 }
25 int getShm(int size)
26 {
27 return commShm(size,IPC_CREAT);
28 }
29 int destoryShm(int shmid)
30 {
31 if(shmctl(shmid,IPC_RMID,NULL)<0)
32 {
33 perror("shmctl");
34 return -1;
35 }
36 }