为了账号安全,请及时绑定邮箱和手机立即绑定

已解决:C 和 Python:通过 mmap 填充文件为空

已解决:C 和 Python:通过 mmap 填充文件为空

回首忆惘然 2022-05-24 15:06:30
我想在 C(创建映射文件并仅从中读取)和 python(写入和填充映射文件)之间创建一个共享映射文件。我有这个 C 代码:#include <sys/types.h>#include <sys/mman.h>#include <err.h>#include <fcntl.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>int main(void){    char *shared;    int fd = -1;    fd = open("hello.txt", O_RDWR, 0);    if (fd == -1) {        printf("unable to open");        return 0;    }    shared = (char *)mmap(NULL, 1, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);    system("python /home/giuseppe/Documents/test_mmap/mappalo.py");    printf("C CODE: %c\n",shared[0]);}这是一个python代码:import sysimport osimport mmapwith open( "hello.txt", "wb" ) as fd:    fd.write("1")with open( "hello.txt", "r+b" ) as fd:    mm = mmap.mmap(fd.fileno(), 0, flags=mmap.MAP_SHARED, access=mmap.ACCESS_WRITE, offset=0)    print("content read from file")    print(mm.readline())    mm[0] = "01"    mm.close()    fd.close()当我执行 C 代码时,我得到这个错误:content read from file1Traceback (most recent call last):  File "/home/giuseppe/Documents/test_mmap/mappalo.py", line 11, in <module>    mm[0] = "01"IndexError: mmap assignment must be single-character stringC CODE: 1如何从 python 代码中写入映射文件中的长字符串,然后从 C 代码中读取它?非常感谢您的参与更新 我想写两个字符串,所以我写了这段代码:arr = bytes("Hello123;", 'utf-8')arr1 = bytes("Hello412;", 'utf-8')size = sys.getsizeof(arr) + sys.getsizeof(arr1)with buf:    buf[:size] = struct.pack('ss', arr1, arr)但我有以下错误:IndexError: mmap slice assignment is wrong size更新 2 感谢 Sam Mason 让我解决问题。这是代码: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, 4096) < 0) {    perror("unable to set length");    return 1;  }  int *shared = mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);  //system("python3.7 mappalo.py");  printf("C CODE: %s\n", shared);  return 0;}
查看完整描述

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 空间


查看完整回答
反对 回复 2022-05-24
  • 1 回答
  • 0 关注
  • 262 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信