标签:封装数据 自动 idt 允许 class 封装 and 技术分享 运行
一、概念
int shmget(key_t key, size_t size, int shmflg); //1.创建或获取共享内存
void *shmat(int shmid,const void* shmaddr,int shmflg); //2.进程链接共享内存
int shmdt(const void* shmaddr); //3.共享内存与当前进程脱离开
int shmctl(int shmid, int cmd, struct shmid_ds *buf); //4.共享内存控制函数
二、函数参数介绍
1.shmget函数 :创建或获取共享内存
int shmget(key_t key,size_t size, int shmflg);3.shmdt函数 :共享内存与当前进程脱离开
4.shmctl函数 :共享内存控制函数
int shmctl(int shm_id,int command, struct shmid_ds *buf);
shm_id: 由shmget返回的共享内存标识码三、代码实例
创建共享内存,并不同进程对创建的共享内存读写操作,最后删除该共享内存。
1.创建共享内存: shmget.c文件
1 #include "stu.h" 2 #include<stdio.h> 3 #include<sys/ipc.h> 4 #include<sys/shm.h> 5 #include<stdlib.h> 6 7 int main() 8 { 9 int shmid = shmget((key_t)0x1001, sizeof(stu_t)*10, IPC_CREAT | IPC_EXCL | 0666); 10 if(shmid == -1) 11 { 12 perror("shmget"); 13 exit(EXIT_FAILURE); 14 } 15 printf("shared memory created success, shmid = %d", shmid); 16 return 0; 17 }
2.往共享内存写数据 shmput.c文件
1 #include "stu.h" 2 #include<stdio.h> 3 #include<sys/ipc.h> 4 #include<sys/shm.h> 5 #include<stdlib.h> 6 #include<unistd.h> 7 #include<string.h> 8 9 /******** 共享内存链接 *********** 10 *1.获取shmid 11 *2.连接共享内存 12 *3.封装数据结构 13 *4.写数据 14 ***********************************/ 15 int main(int argc, char* argv[]) 16 { 17 //1.获取shmid 18 int shmid = shmget((key_t)0x1001, 10, 0); 19 if(shmid == -1) 20 { 21 perror("shmget"); 22 exit(EXIT_FAILURE); 23 } 24 //2.连接共享内存 25 void *pShm = shmat(shmid, 0, 0); 26 if(pShm == (void*)-1) 27 { 28 perror("shmat"); 29 exit(EXIT_FAILURE); 30 } 31 //3.封装数据结构 32 stu_t aStu = {1001, "Tom"}; 33 //4.写数据 34 memcpy(pShm, &aStu, sizeof(stu_t)); 35 //5.用完了就要断开连接 36 if(shmdt(pShm)!= 0) 37 { 38 perror("shmdt"); 39 exit(EXIT_FAILURE); 40 } 41 return 0; 42 }
3.从共享内存读数据 shmread.c文件
1 #include "stu.h" 2 #include<stdio.h> 3 #include<sys/ipc.h> 4 #include<sys/shm.h> 5 #include<stdlib.h> 6 #include<unistd.h> 7 #include<string.h> 8 9 /******** 共享内存链接 *********** 10 *1.获取shmid 11 *2.连接共享内存 12 *3.封装数据结构 13 *4.写数据 14 ***********************************/ 15 16 int main(int argc, char* argv[]) 17 { 18 //1.获取shmid 19 int shmid = shmget((key_t)0x1001, 10, 0); 20 if(shmid == -1) 21 { 22 perror("shmget"); 23 exit(EXIT_FAILURE); 24 } 25 //2.连接共享内存 26 void *pShm = shmat(shmid, 0, 0); 27 if(pShm == (void*)-1) 28 { 29 perror("shmat"); 30 exit(EXIT_FAILURE); 31 } 32 //3.封装数据结构 33 stu_t aStu = {0}; 34 //4.写数据 35 memcpy(&aStu, pShm, sizeof(stu_t)); 36 printf("get shmid = %d, name = %s\n", aStu.id, aStu.name); 37 //5.用完了就要断开连接 38 if(shmdt(pShm)!= 0) 39 { 40 perror("shmdt"); 41 exit(EXIT_FAILURE); 42 } 43 return 0; 44 }
4.删除共享内存 shmctl.c文件
1 #include "stu.h" 2 #include<stdio.h> 3 #include<sys/ipc.h> 4 #include<sys/shm.h> 5 #include<stdlib.h> 6 7 int main() 8 { 9 int shmid = shmget((key_t)0x1001, 10 , 0); 10 if(shmid == -1) 11 { 12 perror("shmget"); 13 exit(EXIT_FAILURE); 14 } 15 if(shmctl(shmid, IPC_RMID, NULL) == -1) 16 { 17 perror("shmctl"); 18 exit(EXIT_FAILURE); 19 } 20 return 0; 21 }
5.公有文件: stu.h
1 #ifndef _STU_H 2 #define _STU_H 3 4 typedef struct student_s 5 { 6 int id; 7 char name[32]; 8 }stu_t; 9 10 #endif
Linux下运行图:
标签:封装数据 自动 idt 允许 class 封装 and 技术分享 运行
原文地址:https://www.cnblogs.com/Dana-gx/p/9735683.html