即使分配了内存,也会出现 Memcpy 分段错误
Memcpy segmentation fault even when memory is allocated
我试图通过将数据写入内存来从一个文件复制数据,然后使用 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;
}
creat
创建一个只为写入而打开的文件。你不能 mmap
这样的文件描述符,因为没有只写内存这样的东西。如果您要检查 out_fd
的 mmap
中的 return 值,您会发现它失败了,errno == EACCES
。当 mmap
失败时,它 return 是一个无效指针 MAP_FAILED
(不是 NULL,但通常是 -1
),当 memcpy
尝试写入时会导致段错误。
请注意 if (!out_data)
因此是 mmap
失败的错误测试;你必须使用 if (out_data == MAP_FAILED)
.
而不是 creat
,使用 open(argv[2], O_RDWR | O_CREAT | O_TRUNC, OUTPUT_MODE)
。
我试图通过将数据写入内存来从一个文件复制数据,然后使用 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;
}
creat
创建一个只为写入而打开的文件。你不能 mmap
这样的文件描述符,因为没有只写内存这样的东西。如果您要检查 out_fd
的 mmap
中的 return 值,您会发现它失败了,errno == EACCES
。当 mmap
失败时,它 return 是一个无效指针 MAP_FAILED
(不是 NULL,但通常是 -1
),当 memcpy
尝试写入时会导致段错误。
请注意 if (!out_data)
因此是 mmap
失败的错误测试;你必须使用 if (out_data == MAP_FAILED)
.
而不是 creat
,使用 open(argv[2], O_RDWR | O_CREAT | O_TRUNC, OUTPUT_MODE)
。