【问题标题】:Memcpy segmentation fault even when memory is allocated即使分配了内存,Memcpy 分段错误
【发布时间】:2020-12-02 05:52:16
【问题描述】:

我正在尝试通过将数据写入内存来从一个文件中复制数据,然后使用 memcpy 将其复制到另一个文件中,但我很难过。我无法让它停止给我分段错误。我感觉它与分配的内存有关,但我也确保输出文件的文件大小与第一个文件相同,因此它不会有这个问题并且可以将数据粘贴到其中。

编辑:我开始认为它与 char out_data 以及当它是只读的时我如何尝试将数据复制到其中有关。不知道该怎么做。

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <string.h>
#include <chrono>
using namespace std;
using namespace std::chrono;



#define OUTPUT_MODE 0700         // protection bits for output file

int main(int argc, char** argv)
{

  auto start = high_resolution_clock::now();
    /* Open the specified file */
    int fd = open(argv[1], O_RDWR);



    // stats.st_size is a variable containing the size of inFile.txt
    struct stat instats;
    if (stat(argv[1], &instats)==0)
            cout<<endl<<"inFile size "<<instats.st_size;
    else
           cout<<"Unable to get file properties.\n";



    /* Get the page size  */
    int pagesize = getpagesize();
    cout<<endl<<"page size is " <<pagesize<<"\n";

    /******************Creation of outFile.txt******************/
    int out_fd = creat(argv[2], OUTPUT_MODE);


    char* in_data = (char*)mmap(NULL, instats.st_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

    ftruncate(out_fd, instats.st_size);


    char* out_data = (char*)mmap(NULL, instats.st_size, PROT_READ | PROT_WRITE, MAP_SHARED, out_fd, 0);


// THIS LINE IS THE CULPRIT 
    memcpy(out_data, in_data, instats.st_size);


    /* Unmap the shared memory region */
    munmap(in_data, instats.st_size);
    munmap(out_data, instats.st_size);

    /* Close the file */
    close(fd);
    close(out_fd);

    return 0;
}

【问题讨论】:

  • 检查所有系统调用是否成功,尤其是mmap
  • 在调用memcpy()之前,您没有进行任何错误处理以确保open()creat()mmap()确实成功
  • 你有一个从未定义过的outstats,它应该是instats吗?
  • @RemyLebeau 我已经进行了一些测试以确保它们是,并且文件确实是用 creat 创建的,我知道它确实打开了,因为我用 cout 从 indata 输出数据并显示了它.我的问题是我正在尝试在 char* (out_data) 上执行 memcpy,因为这使它只读,所以不起作用。
  • @NateEldredge 已修复,抱歉

标签: c++ file mmap memcpy


【解决方案1】:

creat 创建一个只为写入而打开的文件。您不能mmap 这样的文件描述符,因为不存在只写内存之类的东西。如果你从out_fdmmap 中检查返回值,你会发现它失败了,errno == EACCES。当mmap 失败时,它会返回一个无效的指针MAP_FAILED(不是NULL,但通常是-1),当memcpy 尝试在那里写入时会导致段错误。

请注意,if (!out_data) 因此是mmap 失败的错误测试;你必须使用if (out_data == MAP_FAILED)

使用open(argv[2], O_RDWR | O_CREAT | O_TRUNC, OUTPUT_MODE),而不是creat

【讨论】:

  • 是的,你说得对。有人告诉我,我需要使用 creat,例如:out_fd = creat(argv[2], OUTPUT_MODE);
  • 好吧,谁告诉你那是错的,恐怕。如果你这样做了,那么你将无法使用mmap 来访问该文件,尽管你仍然可以使用write()
  • 知道了,我去跟他们谈谈。
猜你喜欢
  • 2021-09-25
  • 1970-01-01
  • 2016-09-29
  • 2019-10-08
  • 1970-01-01
  • 1970-01-01
  • 2014-07-01
  • 1970-01-01
  • 2021-06-14
相关资源
最近更新 更多