Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何使用mmap共享部分内存_C_Linux_Mmap - Fatal编程技术网

C 如何使用mmap共享部分内存

C 如何使用mmap共享部分内存,c,linux,mmap,C,Linux,Mmap,我有3个工具,我需要它们共享相同的4096字节的内存。 每个工具都可以独立地增加它们的内存 因此,简历: 工具1: 0-4096:在1,2,3之间共享 4097-8192:内部到1 工具2: 0-4096:在1,2,3之间共享 4097-16384:内部到2 工具3: 0-4096:在1,2,3之间共享 4097-12288:内部至3 因为我更喜欢mmap,所以可以使用mmap来实现我的目标吗? 如果有其他解决方案,也许我可以修改我的代码 提前感谢您的帮助。映射和使用虚拟内存的第一页时存在严重的

我有3个工具,我需要它们共享相同的4096字节的内存。 每个工具都可以独立地增加它们的内存

因此,简历:

工具1:

0-4096:在1,2,3之间共享

4097-8192:内部到1

工具2:

0-4096:在1,2,3之间共享

4097-16384:内部到2

工具3:

0-4096:在1,2,3之间共享

4097-12288:内部至3

因为我更喜欢mmap,所以可以使用mmap来实现我的目标吗? 如果有其他解决方案,也许我可以修改我的代码


提前感谢您的帮助。

映射和使用虚拟内存的第一页时存在严重的安全性和可维护性问题,但如果您确实愿意,可以这样做

首先,您需要调整一个sysctl,以防止您执行类似的操作(有充分的理由):

然后像通常使用共享内存一样使用
mmap
,但
MAP\u是固定的
。现在您可以读写第一页(包括空指针):

以这种方式映射共享文件的所有进程都将共享4096字节的内存(映射到零页)。在本例中,我使用了POSIX共享内存,但您可以使用任何文件,只要将其截断为4096字节


你应该认真考虑你想做的事情,如果这真的是必要的。

我需要他们分享他们自己的记忆的前4096个字节,你说的“他们自己的记忆”是什么意思?我假设您的意思类似于堆内存,因为进程的前4096字节是地址0x00000000,并且该页受读/写保护。当您使用
mmap
时,您可以得到一个指向程序共享区域的指针。但是,具体地址不应该引起关注。如果是,为什么?你应该在问题中发布你的代码,并问一个[更]具体的关于其操作的问题。我的意思是0是每个工具中一种线性内存的开始。所以,0是每个内存工具使用的起始指针。你说的“一种线性内存”是什么意思?在一个进程中,所有内存都是线性的。我认为你已经接近XY问题了:所以,暂时忘掉
mmap
等,描述一下你想要实现的目标。(例如)“我正在编写需要共享学生数据的程序”您需要什么
mmap
是一种需求解决方案。我的意思是0是每个工具中一种线性内存的开始。因此,0是每个内存工具使用的起始指针。但是如何共享前4096字节,如何在内部保护添加的内存不被其他两个工具访问;它与恰好为零的变量地址是不同的。Malloc、fopen等不应返回零,因为这将等于它们的NULL错误返回。然而,没有理由&x不能为零。@Alphapage:我不确定我是否理解你的问题。通过在所有三个进程中运行上述代码,前4096字节的内存将在它们之间共享,但所有其他内存将不会共享。您可以映射每个进程中的另一个内存,它只能在内部访问。在linux中,默认情况下,进程之间不共享内存
sudo sysctl -w vm.mmap_min_addr=0
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>

int main()
{
        int fd = shm_open("silly_example", O_RDWR | O_CREAT, 0600);
        mmap(0, 4096, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_FIXED, fd, 0);
        ftruncate(fd, 4096);
        int *ptr = (int*) 0;
        *ptr = 123;
        printf("%d\n", *ptr);
        getchar();
}
$ cat /proc/17444/maps
00000000-00001000 rw-s 00000000 00:12 41774576                           /dev/shm/silly_example