建p2p网站,苏州市城乡和建设局网站首页,注册1000万公司每年费用多少,聊城阳谷网站建设文章目录 2.28共享内存#xff08;1#xff09;共享内存#xff08;效率最高#xff0c;比内存映射更高。因为内存映射还需一个文件做载体#xff09;共享内存使用步骤共享内存操作函数头文件 2.29共享内存#xff08;2#xff09;共享内存相关问题共享内存和内存映射的… 文章目录 2.28共享内存1共享内存效率最高比内存映射更高。因为内存映射还需一个文件做载体共享内存使用步骤共享内存操作函数头文件 2.29共享内存2共享内存相关问题共享内存和内存映射的区别通过共享内存实现进程间通信共享内存操作命令 2.28共享内存1
共享内存效率最高比内存映射更高。因为内存映射还需一个文件做载体 IPCInter-Process Communication 进程间通信
新的问题两个进程同时写数据一个进程读数据涉及进程同步问题。
共享内存使用步骤
shmshare memory atattach 在虚拟内存的用户区 的 共享区 内存映射也在这里 dtdetach ctlcontrol
分离和销毁是不同的。
共享内存操作函数 头文件
#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.hint 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.hint 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就查不到它了