共享內存spa
1.封裝接口code
#include"shm.h" //獲取惟一鍵值 key_t get_key(void){ return ftok("/",0x111); } //建立共享內存 int creat_shm(key_t key, size_t size){ return shmget(key, size, 0666|IPC_CREAT); } //獲取共享內存 int get_shm(key_t key, size_t size){ return shmget(key, size, 0666); } //掛載共享內存 void* map_shm(int shmid){ return shmat(shmid, NULL, 0); } //卸載共享內存 int unmap_shm(void* shm_addr){ return shmdt(shm_addr); } //刪除共享內存 int delet_shm(int shmid){ return shmctl(shmid, IPC_RMID, NULL); }
2.頭文件server
#pragma once #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <sys/ipc.h> #include <sys/shm.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <strings.h> #include <unistd.h> extern key_t get_key(void); extern int creat_shm(key_t key, size_t size); extern int get_shm(key_t key, size_t size); extern void* map_shm(int shmid); extern int unmap_shm(void* shm_addr); extern int delet_shm(int shmid);
3.clientblog
#include"shm.h" int main(void) { key_t key = get_key(); // 獲取鍵值 if(key<0){ perror("get_key failed "); exit(1); } int shmid = creat_shm(key, 1024); // 建立 if(shmid < 0){ perror("creat failed "); exit(1); } char* buf = (char*) map_shm(shmid);// 掛載 if(buf<0){ perror("map failed "); exit(1); } while(1){ // 讀 fputs(buf,stdout); if(strncmp(buf, "exit",4)==0) break; sleep(1); } if(unmap_shm(buf) <0){ // 卸載 perror("unmap failed "); exit(1); } delet_shm(shmid); // 刪除 return 0 ; }
4.server接口
#include"shm.h" int main(void) { key_t key = get_key(); // 獲取鍵值 if(key<0){ perror("get_key failed"); exit(1); } int shmid = get_shm(key,1024); // 獲取 if(shmid<0){ perror("get_shm failed"); exit(1); } char* buf = (char*)map_shm(shmid); // 掛載 if(buf<0){ perror("map failed"); exit(1); } while(1){ // 寫 fgets(buf,1024,stdin); if(strncmp(buf,"exit",4)==0) break; } if(unmap_shm(buf)<0){ // 卸載 perror("unmap"); exit(1); } delet_shm(shmid); // 刪除 return 0; }
success !ip