参考网址:
进程间通信——共享内存(Shared Memory)_ypt-CSDN博客_共享内存
例程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| #ifndef _COMM_H__ #define _COMM_H__ #include<stdio.h> #include<sys/types.h> #include<sys/ipc.h> #include<sys/shm.h> #define PATHNAME "." #define PROJ_ID 0x6666 int CreateShm(int size); int DestroyShm(int shmid); int GetShm(int size); #endif
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| #include"comm.h" static int CommShm(int size,int flags) { key_t key = ftok(PATHNAME,PROJ_ID); if(key < 0) { perror("ftok"); return -1; } int shmid = 0; if((shmid = shmget(key,size,flags)) < 0) { perror("shmget"); return -2; } return shmid; } int DestroyShm(int shmid) { if(shmctl(shmid,IPC_RMID,NULL) < 0) { perror("shmctl"); return -1; } return 0; } int CreateShm(int size) { return CommShm(size,IPC_CREAT | IPC_EXCL | 0666); } int GetShm(int size) { return CommShm(size,IPC_CREAT); }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| #include"comm.h" int main() { int shmid = GetShm(4096); sleep(1); char *addr = shmat(shmid,NULL,0); sleep(2); int i = 0; while(i < 26) { addr[i] = 'A' + i; i++; addr[i] = 0; sleep(1); } shmdt(addr); sleep(2); return 0; }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| #include"comm.h" int main() { int shmid = CreateShm(4096); char *addr = shmat(shmid,NULL,0); sleep(2); int i = 0; while(i++ < 26) { printf("client# %s\n",addr); sleep(1); } shmdt(addr); sleep(2); DestroyShm(shmid); return 0; }
|
1 2 3 4 5 6 7 8 9 10 11 12
| //Makefile .PHONY:all all:server client client:client.c comm.c gcc -o $@ $^ server:server.c comm.c gcc -o $@ $^ .PHONY:clean clean: rm -f client server
|