1.shmget 创建/获取内核共享内存
2.shmat(attach)关联到当前进程地址空间
3.通过指针读写共享内存
4.shmdt(detech)进程分离共享内存
5.shmctl删除共享内存
附上案例
第一种:在同一个执行文件中通过fork的方式创建子进程
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/wait.h>
#include <unistd.h>
typedef struct User{
int num;
char str[256];
}User;
int main()
{
User *p;
int shmid = shmget(IPC_PRIVATE,128,0755|IPC_CREAT); //1.创建共享内存空间
if(shmid<0){
perror("shmget");
exit(1);
}
printf("shmget success %d\n",shmid); //创建的共享内存可用 ipcrm -m id删除
system("ipcs -m"); //调用内核,显示当前系统的共享内存
int pid = fork();
if(pid == 0) //进程本身,即父进程,在父进程中给共享内存写数据
{
p = (User*)shmat(shmid,NULL,0); //将char类型数据关联到共享内存
p->num = 10;
strcpy(p->str,"hello");
shmdt(p); //将指针与共享内存分离
}else{
sleep(1); //子进程,在子进程中读取数据
p = (User*)shmat(shmid,NULL,0);
printf("%d %s\n",p->num,p->str);
shmdt(p);
shmctl(shmid,IPC_RMID,NULL);
system("ipcs -m"); //再打印一下,确认有没有删除
}
}
第二种:在2个进程中共用同一块共享内存的方法
test1.cpp. 该进程写数据
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/wait.h>
#include <unistd.h>
typedef struct User{
int num;
char str[256];
}User;
int main()
{
int shmky = ftok("./test1.cpp",'a'); //通过同一个文件生成相同的key,用于读取同一个内存
if(shmky<0){
perror("ftok");
return -2;
}
User *p;
int shmid = shmget(shmky,128,0755|IPC_CREAT); //1.创建共享内存空间
if(shmid<0){
perror("shmget");
exit(1);
}
printf("shmget success %d\n",shmid); //创建的共享内存可用 ipcrm -m id删除
system("ipcs -m"); //调用内核,显示当前系统的共享内存
p = (User*)shmat(shmid,NULL,0); //将char类型数据关联到共享内存
p->num = 10; //在该进程中写数据
strcpy(p->str,"hello");
sleep(20); //避免进程结束,无法与另一个进程交互
shmdt(p); //将指针与共享内存分离
}
test2.cpp 该进程读数据
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/wait.h>
#include <unistd.h>
typedef struct User{
int num;
char str[256];
}User;
int main()
{
int shmky = ftok("./test1.cpp",'a'); //通过同一个文件生成相同的key,用于读取同一个内存
if(shmky<0){
perror("ftok");
return -2;
}
User *p;
int shmid = shmget(shmky,128,0755|IPC_CREAT); //1.创建共享内存空间
if(shmid<0){
perror("shmget");
exit(1);
}
printf("shmget success %d\n",shmid); //创建的共享内存可用 ipcrm -m id删除
//system("ipcs -m"); //调用内核,显示当前系统的共享内存
sleep(1); //在这个进程中读取数据
p = (User*)shmat(shmid,NULL,0);
printf("%d %s\n",p->num,p->str);
shmdt(p);
shmctl(shmid,IPC_RMID,NULL);
system("ipcs -m");
}