Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.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和Python:通过mmap填充一个空文件_Python_C_File_Mmap_Shared - Fatal编程技术网

解析:C和Python:通过mmap填充一个空文件

解析:C和Python:通过mmap填充一个空文件,python,c,file,mmap,shared,Python,C,File,Mmap,Shared,我希望在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

我希望在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]);

}
执行C代码时,出现以下错误:

content read from file
1
Traceback (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 string
C CODE: 1
但我有以下错误:

IndexError: mmap slice assignment is wrong size
更新2 谢谢山姆·梅森,让我能够解决这个问题。代码如下:

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

您在C代码和Python代码中都做了各种奇怪的事情。我将从一些“有效”的代码开始:

首先,C代码:

#包括
#包括
#包括
#包括
#包括
#包括
内部主(空)
{
int fd=open(“hello.txt”,O|RDWR | O|u CREAT,0666);
如果(fd==-1){
perror(“无法打开”);
返回1;
}
如果(ftruncate(fd,1024)<0){
perror(“无法设置长度”);
返回1;
}
int*shared=mmap(NULL,1024,PROT_READ | PROT_WRITE,MAP_shared,fd,0);
系统(“pythonmap test.py”);
printf(“C代码:%i%i\n”,共享[0],共享[1]);
返回0;
}
我已经对头文件做了一些修剪,并确保文件中包含一些数据(在这种情况下,内核将用零惰性地填充文件)。我还将其视为
int
s的数组,因为单个字节的传输是毫无意义的。此外,通常建议不要从
void*
转换为其他类型。我还将权限掩码设置为合理的值,零将在以后破坏这些内容

下一个Python代码:

import sys
import os
import mmap

with 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()
import mmap
import struct

with open('hello.txt', 'r+b') as fd:
    buf = mmap.mmap(fd.fileno(), 4096, access=mmap.ACCESS_DEFAULT)

arr = bytes("Hello123;", 'utf-8')
arr1 = bytes("Hello412;", 'utf-8')
size = len(arr) + len(arr1)
types = str(len(arr))+'s' + str(len(arr1))+'s'

with buf:
    buf[:size] = struct.pack(types, arr1, arr)
导入mmap
导入结构
以open('hello.txt','r+b')作为fd:
buf=mmap.mmap(fd.fileno(),1024,access=mmap.access\u默认值)
使用buf:
buf[:8]=结构包('ii',123,7901)

我只需打开它一次,将数据映射进来,将两个Python
int
s编码为两个C-
int
s的字节数组。
语句的非嵌套是为了表明
mmap
可以单独打开文件,但您可能希望将它们嵌套在自己的代码中。在Python中,您的两个
open
s还创建了第二个文件(同名,替换了C文件),这可能会让人感到困惑。另外,您没有将正确大小/类型的数据写入
mmap
ed空间

您在C代码和Python代码中都做了各种奇怪的事情。我将从一些“有效”的代码开始:

首先,C代码:

#包括
#包括
#包括
#包括
#包括
#包括
内部主(空)
{
int fd=open(“hello.txt”,O|RDWR | O|u CREAT,0666);
如果(fd==-1){
perror(“无法打开”);
返回1;
}
如果(ftruncate(fd,1024)<0){
perror(“无法设置长度”);
返回1;
}
int*shared=mmap(NULL,1024,PROT_READ | PROT_WRITE,MAP_shared,fd,0);
系统(“pythonmap test.py”);
printf(“C代码:%i%i\n”,共享[0],共享[1]);
返回0;
}
我已经对头文件做了一些修剪,并确保文件中包含一些数据(在这种情况下,内核将用零惰性地填充文件)。我还将其视为
int
s的数组,因为单个字节的传输是毫无意义的。此外,通常建议不要从
void*
转换为其他类型。我还将权限掩码设置为合理的值,零将在以后破坏这些内容

下一个Python代码:

import sys
import os
import mmap

with 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()
import mmap
import struct

with open('hello.txt', 'r+b') as fd:
    buf = mmap.mmap(fd.fileno(), 4096, access=mmap.ACCESS_DEFAULT)

arr = bytes("Hello123;", 'utf-8')
arr1 = bytes("Hello412;", 'utf-8')
size = len(arr) + len(arr1)
types = str(len(arr))+'s' + str(len(arr1))+'s'

with buf:
    buf[:size] = struct.pack(types, arr1, arr)
导入mmap
导入结构
以open('hello.txt','r+b')作为fd:
buf=mmap.mmap(fd.fileno(),1024,access=mmap.access\u默认值)
使用buf:
buf[:8]=结构包('ii',123,7901)

我只需打开它一次,将数据映射进来,将两个Python
int
s编码为两个C-
int
s的字节数组。
语句的非嵌套是为了表明
mmap
可以单独打开文件,但您可能希望将它们嵌套在自己的代码中。在Python中,您的两个
open
s还创建了第二个文件(同名,替换了C文件),这可能会让人感到困惑。另外,您没有将正确大小/类型的数据写入
mmap
ed空间

能否尝试
mm[0:]=b“01”
(取自上的第一个示例)@TomDalton您的代码产生以下错误:
文件/home/giuseppe/Documents/test_mmap/mappalo.py”,第11行,mm[0:]=b“01”索引器:mmap切片分配大小错误
Try
mm[0:2]=b“01”
。我不确定是否/如何使用mmap来扩展现有文件的大小。您创建了一个包含1个字节的文件,但看起来您正试图使用mmap覆盖其中的2个字节,我不确定您是否可以这样做。@TomDalton我编辑了创建共享文件的指令,如下所示:
shared=(char*)mmap(NULL,4096,PROT_READ | PROT_WRITE,MAP_shared,fd,0)但它会产生相同的错误。您可以尝试
mm[0:]=b“01”
(取自上一个示例)@TomDalton您的代码会产生此错误:
文件/home/giuseppe/Documents/test_mmap/mappalo.py”,第11行,在mm[0:]=b“01”索引器中。mmap切片分配的大小错误
那么,尝试
mm[0:2]=b“01”
。我不确定是否/如何使用mmap来扩展现有文件的大小。您创建了一个包含1个字节的文件,但看起来您正试图使用mmap覆盖其中的2个字节,我不确定您是否可以这样做。@TomDalton我编辑了创建共享文件的指令,如下所示:
shared=(char*)mmap(NULL,4096,PROT_READ | PROT_WRITE,MAP_shared,fd,0)但它会产生同样的错误非常感谢您的工作..现在mmap的操作更加清晰了!但是我想写两个字符串,所以我写了这段代码:
arr=bytes(“Hello123;”,'utf-8')arr1=bytes(“Hello412;”,'utf-8')size=sys.getsizeof(arr)+sys.getsizeof(arr1),其中buf:buf[:size]=struct.pack('ss',arr1,arr)
但我有以下错误:
索引器:mmap切片分配大小错误
在注释中发布太多代码是不可读的。。请编辑您的问题并将其放到我的位置