Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.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 Kernel_Kernel_Mmap - Fatal编程技术网

C 复制到用户无法将数据从内核复制到mmap用户?

C 复制到用户无法将数据从内核复制到mmap用户?,c,linux-kernel,kernel,mmap,C,Linux Kernel,Kernel,Mmap,在用户空间程序中,我通过mmap分配一些内存,如下函数调用: void *memory; int fd; fd = open(filepath, O_RDWR); if (fd < 0) return errno; memory = mmap(NULL, 4096, PROT_WRITE, MAP_SHARED, fd, 0); if (memory == MAP_FAILED) return -1; //syscall() goes here 编辑:在帖子中添加了

在用户空间程序中,我通过mmap分配一些内存,如下函数调用:

void *memory;
int fd;
fd = open(filepath, O_RDWR);
if (fd < 0)
   return errno;

memory = mmap(NULL, 4096, PROT_WRITE, MAP_SHARED, fd, 0);
if (memory == MAP_FAILED)
      return -1;

//syscall() goes here
编辑:在帖子中添加了错误检查代码以进行澄清 在这种情况下,
copy\u to\u user()
调用反复失败,而如果我执行
memory=malloc()
调用,它总是成功的


在这种情况下,mmap的某些权限标志是否有误?

打开是否成功?mmap呢?目标文件是否足够大?可以通过用户空间中的映射写入文件吗


此外,重复的4096是一个强烈的打击你的代码是错误的。用户空间应该通过预期的大小。

目标文件是新创建的,我不明白“足够大”是什么意思,出于写入目的,数据将写入文件,对吗?open()调用肯定成功了,4096并不仅仅是为了表示的目的而重复。那么mmap呢(您如何检查它,特别是您是否测试MAP_失败?)。我怀疑文件大小为0,这将阻止将\u复制到\u用户。我不明白关于通过映射写入的问题有什么不清楚的地方-内存[0]='A'或类似的,对于instance。完成后,它可能会触发SIGBUS,清楚地显示问题与复制用户无关。那么,第三次的大小如何。第二次:目标文件是新创建的,我不理解您所说的“足够大”是什么意思,出于写入目的,数据将写入文件,对吗?文件大小如何影响用于写入目的的“复制到”用户或mmap?通过映射区域写入不会增加文件。它必须足够大,足以覆盖整个区域。因此,特别是,如果文件大小为0,则能够捕获该条件的复制到用户之类的操作将失败。ftruncate文件到4096或更高。错误是什么?你用什么?我们无法仅在您实际编写的内容上为您提供帮助。内核空间中的copy_to_user()不会设置可通过
perror()预测的
errno
copy_to_user(memory,src,4096);