首页 > 解决方案 > 一起使用 shm_open 和 mmap 有什么用?

问题描述

在阅读了手册页之后,我了解到shm_openandshm_unlink基本上类似于mmapand munmap,不同之处在于它shm适用于 System V 和mmap适用于 POSIX。既然两者都可以用于共享内存,那么两者一起使用有优势吗?例如:

这段代码

int main( ) {
    
    int size = 1024;
    char* name   = "test";

    int fd  = shm_open(name, O_RDWR|O_CREAT|O_TRUNC, 0600 );
    ftruncate(fd, size);
    char *ptr = (char *) mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);

    if (fork()) { // parent
        ftruncate(fd, size); // cut the file to a specific length
        char* msg = (char*)malloc(50*sizeof(char));
        sprintf(msg, "parent process with id %d wrote this in shared memory",getpid()); // copy this in msg
        strcpy((char*)ptr,msg); // copy msg in ptr (the mmap)
        munmap(ptr,size); // parent process no longer has access to this memory space
        shm_unlink(name); // parent process is no longer linked to the space named "test"
    } else {
        sleep(0.00001);
        printf("Inside child process %d :  %s\n", getpid(), ptr);
        munmap(ptr,size);
        exit(0);
    }
}

将输出

Inside child process 5149 :  parent process with id 5148 wrote this in shared memory

如果我删除 fd 并将其替换为 -1 并添加标志MAP_ANONYMOUS

int main( ) {
    
    int size = 1024;
    char* name   = "test";

    char *ptr = (char *) mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);

    if (fork() != 0) { // parent
        char* msg = (char*)malloc(50*sizeof(char));
        sprintf(msg, "parent process with id %d wrote this in shared memory",getpid()); // copy this in msg
        strcpy((char*)ptr,msg); // copy msg in ptr (the mmap)
        munmap(ptr,size); // parent process no longer has access to this memory space
    } else {
        sleep(0.00001);
        printf("Inside child process %d :  %s\n", getpid(), ptr);
        munmap(ptr,size);
        exit(0);
    }
}

输出不变。那么为什么要使用 shm_get 呢?

谢谢

标签: cipcshared-memorymmapposix-api

解决方案


推荐阅读