1 回答
TA贡献1852条经验 获得超1个赞
您在 C 代码和 Python 代码中都在做各种奇怪的事情。我将从一些“有效”的代码开始:
首先,C代码:
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
int fd = open("hello.txt", O_RDWR | O_CREAT, 0666);
if (fd == -1) {
perror("unable to open");
return 1;
}
if (ftruncate(fd, 1024) < 0) {
perror("unable to set length");
return 1;
}
int *shared = mmap(NULL, 1024, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
system("python mmap-test.py");
printf("C CODE: %i %i\n", shared[0], shared[1]);
return 0;
}
我已经稍微修剪了标题,并确保文件中有一些数据(在这种情况下,内核会懒惰地用零填充)。我还将它视为ints 的数组,因为单个字节对传输毫无意义。此外,通常建议您不要转换void*为另一种类型。我还将权限掩码设置为合理的值,零只会在以后破坏。
下一个 Python 代码:
import mmap
import struct
with open('hello.txt', 'r+b') as fd:
buf = mmap.mmap(fd.fileno(), 1024, access=mmap.ACCESS_DEFAULT)
with buf:
buf[:8] = struct.pack('ii', 123, 7901)
我只打开一次,映射数据,将两个 Python 编码int为两个 C-int的字节数组。语句的非嵌套with旨在表明mmap文件自己打开,但您可能希望将它们嵌套在自己的代码中。您在 Python 中的两个opens 还创建了第二个文件(同名,替换 C 文件),这可能令人困惑。您也没有将正确大小/类型的数据写入mmaped 空间
添加回答
举报