文章目录
- 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就查不到它了
 


















