文章目录
- 2.28共享内存(1)
- 共享内存(效率最高,比内存映射更高。因为内存映射还需一个文件做载体)
- 共享内存使用步骤
- 共享内存操作函数
- 头文件
- 2.29共享内存(2)
- 共享内存相关问题
- 共享内存和内存映射的区别
- 通过共享内存实现进程间通信
- 共享内存操作命令
2.28共享内存(1)
共享内存(效率最高,比内存映射更高。因为内存映射还需一个文件做载体)
IPC:Inter-Process Communication 进程间通信
新的问题:两个进程同时写数据,一个进程读数据,涉及进程同步问题。
共享内存使用步骤
shm:share memory
at:attach (在虚拟内存的用户区 的 共享区 ;内存映射也在这里)
dt:detach
ctl:control
分离和销毁是不同的。
共享内存操作函数
头文件
#include <sys/ipc.h>
#include <sys/shm.h>
- shmget
-
shmat
-
shmdt
shmaddr是虚拟地址空间刚刚绑定的地址。 -
shmctl
第三行 :的进程
IPC_RMID:只是标记共享内存需要被删除。要到没有进程和这块内存绑定了,这块共享内存才会被真的删除
buf:需要的操作cmd不同,buf的作用不同。在标记销毁的时候,buf没有用,所以直接置NULL就可以。
- ftok
如果有很多的key记不过来,可以用这个。名字比身份证号好记
2.29共享内存(2)
共享内存相关问题
共享内存和内存映射的区别
通过共享内存实现进程间通信
共享内存写数据
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <string.h>
int main() {
// 1.创建一个共享内存
int shmid = shmget(100, 4096, IPC_CREAT|0664);
printf("shmid : %d\n", shmid);
// 2.和当前进程进行关联
void * ptr = shmat(shmid, NULL, 0);
char * str = "helloworld";
// 3.写数据
memcpy(ptr, str, strlen(str) + 1);
printf("按任意键继续\n");
getchar();
// 4.解除关联
shmdt(ptr);
// 5.删除共享内存
shmctl(shmid, IPC_RMID, NULL);
return 0;
}
共享内存读数据
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <string.h>
int main() {
// 1.获取一个共享内存
int shmid = shmget(100, 0, IPC_CREAT);
printf("shmid : %d\n", shmid);
// 2.和当前进程进行关联
void * ptr = shmat(shmid, NULL, 0);
// 3.读数据
printf("%s\n", (char *)ptr);
printf("按任意键继续\n");
getchar();
// 4.解除关联
shmdt(ptr);
// 5.删除共享内存
shmctl(shmid, IPC_RMID, NULL);
return 0;
}
共享内存操作命令
ipcs -m 用比较多
被标记销毁以后,key被置0,但是因为还有绑定,所以暂时还没被销毁。直到所有绑定都解除,ipcs -m就查不到它了