【项目 进程13】2.28共享内存(1) 2.29共享内存(2)

文章目录

    • 2.28共享内存(1)
      • 共享内存(效率最高,比内存映射更高。因为内存映射还需一个文件做载体)
      • 共享内存使用步骤
      • 共享内存操作函数
      • 头文件
    • 2.29共享内存(2)
      • 共享内存相关问题
      • 共享内存和内存映射的区别
      • 通过共享内存实现进程间通信
      • 共享内存操作命令


2.28共享内存(1)

共享内存(效率最高,比内存映射更高。因为内存映射还需一个文件做载体)

【项目 进程13】2.28共享内存(1) 2.29共享内存(2)_第1张图片
【项目 进程13】2.28共享内存(1) 2.29共享内存(2)_第2张图片
IPC:Inter-Process Communication 进程间通信

新的问题:两个进程同时写数据,一个进程读数据,涉及进程同步问题。

共享内存使用步骤

【项目 进程13】2.28共享内存(1) 2.29共享内存(2)_第3张图片shm:share memory
at:attach (在虚拟内存的用户区 的 共享区 ;内存映射也在这里)
dt:detach
ctl:control

分离和销毁是不同的。

共享内存操作函数

【项目 进程13】2.28共享内存(1) 2.29共享内存(2)_第4张图片

头文件

#include 
#include 

  • shmget

【项目 进程13】2.28共享内存(1) 2.29共享内存(2)_第5张图片

  • shmat
    【项目 进程13】2.28共享内存(1) 2.29共享内存(2)_第6张图片

  • shmdt
    【项目 进程13】2.28共享内存(1) 2.29共享内存(2)_第7张图片
    shmaddr是虚拟地址空间刚刚绑定的地址。

  • shmctl
    【项目 进程13】2.28共享内存(1) 2.29共享内存(2)_第8张图片第三行 :的进程
    IPC_RMID:只是标记共享内存需要被删除。要到没有进程和这块内存绑定了,这块共享内存才会被真的删除

buf:需要的操作cmd不同,buf的作用不同。在标记销毁的时候,buf没有用,所以直接置NULL就可以。

  • ftok
    【项目 进程13】2.28共享内存(1) 2.29共享内存(2)_第9张图片
    如果有很多的key记不过来,可以用这个。名字比身份证号好记

2.29共享内存(2)

共享内存相关问题

【项目 进程13】2.28共享内存(1) 2.29共享内存(2)_第10张图片

共享内存和内存映射的区别

【项目 进程13】2.28共享内存(1) 2.29共享内存(2)_第11张图片

通过共享内存实现进程间通信

共享内存写数据

#include 
#include 
#include 
#include 

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 
#include 
#include 
#include 

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;
}

共享内存操作命令

【项目 进程13】2.28共享内存(1) 2.29共享内存(2)_第12张图片
ipcs -m 用比较多

【项目 进程13】2.28共享内存(1) 2.29共享内存(2)_第13张图片被标记销毁以后,key被置0,但是因为还有绑定,所以暂时还没被销毁。直到所有绑定都解除,ipcs -m就查不到它了
【项目 进程13】2.28共享内存(1) 2.29共享内存(2)_第14张图片

你可能感兴趣的:(服务器,linux)