共享内存的概念
共享内存 原理:
实现共享内存的步骤:
创建共享内存shmget()
映射 共享内存
什么是映射:共享内存 映射 在不同进程中的地址不同。
把共享内存 从进程地址空间中脱离
代码实例:使用共享内存实现 父子进程间通信:父进程向共享内存中写入内容,子进程从共享内存中读出内容并打印出来。
shm_test.c
#include<sys/stat.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<stdio.h>
#include <errno.h>
#define PERM S_IRUSR|S_IWUSR
int main(int argc, char* argv[]){
int shmid;
char* p_addr;
char* c_addr;
key_t key;
if(argc !=2){
fprintf(stderr,"usge :%s\n",argv[0]);
exit(1);
}
/*创建共享内存*/
if((shmid = shmget(IPC_PRIVATE,1024,PERM)) == -1){
fprintf(stderr,"create share memory error:%s\n",strerror(errno));
exit(1);
}
printf("shmget_ret : %d\n",shmid);
/*创建子进程*/
if(fork()){//父进程写
p_addr = shmat(shmid,0,0);//第二个参数此处为0代表:让系统为我们选择一个映射的地址
printf("shmat_ret: %0x\n",p_addr);
memset(p_addr,'\0',1024);
strncpy(p_addr,argv[1],1024);
printf("p_addr: %s\n",p_addr);
wait(NULL);//等待子进程
exit(0);
}
else{//子进程读
sleep(3);//为了让子进程后开始
printf("child process shmid : %d\n",shmid);
c_addr = shmat(shmid,0,0);
printf("child process shmat_ret: %0x\n",c_addr);
/*if (c_addr == (void *)-1) {
perror("shmat");
// Check errno to determine the error
if (errno == EINVAL) {
printf("Invalid argument passed to shmat\n");
} else if (errno == ENOMEM) {
printf("Insufficient memory to attach shared memory\n");
} else if (errno == EACCES) {
printf("Permission denied\n");
} else {
printf("Unknown error\n");
}
}*/
printf("client get %s\n",c_addr);
exit(0);
}
}
运行结果: