从映射文件中获取第 N 个字节
get N-th byte from mmaped file
我是 C 的新手,现在正在学习 mmap。我想从映射文件中获取第 N 个字节,但出现此错误 Segmentation Fault (core dumped)
当我使用 gdb
测试我的程序时,我发现此行 printf("%d\n", (int) data[sk]);
有问题,然后我print data
我得到
(gdb) print data[sk]
Cannot access memory at address 0xfe5f07d0
(gdb) print data
= 0xfe5f0000 <Address 0xfe5f0000 out of bounds>
我不知道为什么会出现此错误。这是我的代码
int main( int argc, char * argv[] ){
int sk;
int d;
char *data;
size_t s;
if(argc == 3){
sk = atoi(argv[2]);
d = da_open(argv[1]);
s = da_fileSize(d);
data = (char*)da_mmap(d, s);
printf("File Size: %d\n", (int) s);
printf("%d\n", (int) data[sk]); // this line is bad. But why?
close(d);
}
return 0;
}
这里还有我的完整代码
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/time.h>
#include <string.h>
int da_open(const char *name);
void *da_mmap(int d, size_t size);
size_t da_fileSize();
int da_open(const char *name){
int dskr;
dskr = open( name, O_RDWR );
if( dskr == -1 ){
perror( name );
exit(1);
}
printf( "dskr1 = %d\n", dskr );
return dskr;
}
void *da_mmap(int d, size_t size){
void *a = NULL;
a = mmap(NULL, size, PROT_WRITE, MAP_SHARED, d, 0);
if( a == MAP_FAILED ){
perror( "mmap failed" );
abort();
}
return a;
}
size_t da_fileSize(int d){
struct stat info;
if(fstat(d, &info) == -1) {
perror("fstat failed");
exit(1);
}
return (size_t)info.st_size;
}
int main( int argc, char * argv[] ){
int sk;
int d;
char *data;
size_t s;
if(argc == 3){
sk = atoi(argv[2]);
d = da_open(argv[1]);
s = da_fileSize(d);
data = (char*)da_mmap(d, s);
printf("File Size: %d\n", (int) s);
printf("%d\n", (int) data[sk]);
close(d);
}
return 0;
}
我猜您还需要在您的 mmap 中读取权限:PROT_WRITE | PROT_READ
分段错误是指您尝试访问不属于您的内存space。
它通常发生在数组中(就像你的情况一样)。如果您有一个长度为 5 个元素的数组并且您尝试访问第 6 个元素,您将遇到分段错误并且您的程序将停止。
所以在printf("%d\n", (int) data[sk]);
行你的错误可能是sk中的值太大了,你应该试着打印出来检查一下。
您还应该始终检查系统函数(不是您的函数)的 return,例如您的 open() 或 atoi()。如果 open 失败而你又不停止你的程序,那你将度过一段糟糕的时光:)
我是 C 的新手,现在正在学习 mmap。我想从映射文件中获取第 N 个字节,但出现此错误 Segmentation Fault (core dumped)
当我使用 gdb
测试我的程序时,我发现此行 printf("%d\n", (int) data[sk]);
有问题,然后我print data
我得到
(gdb) print data[sk]
Cannot access memory at address 0xfe5f07d0
(gdb) print data
= 0xfe5f0000 <Address 0xfe5f0000 out of bounds>
我不知道为什么会出现此错误。这是我的代码
int main( int argc, char * argv[] ){
int sk;
int d;
char *data;
size_t s;
if(argc == 3){
sk = atoi(argv[2]);
d = da_open(argv[1]);
s = da_fileSize(d);
data = (char*)da_mmap(d, s);
printf("File Size: %d\n", (int) s);
printf("%d\n", (int) data[sk]); // this line is bad. But why?
close(d);
}
return 0;
}
这里还有我的完整代码
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/time.h>
#include <string.h>
int da_open(const char *name);
void *da_mmap(int d, size_t size);
size_t da_fileSize();
int da_open(const char *name){
int dskr;
dskr = open( name, O_RDWR );
if( dskr == -1 ){
perror( name );
exit(1);
}
printf( "dskr1 = %d\n", dskr );
return dskr;
}
void *da_mmap(int d, size_t size){
void *a = NULL;
a = mmap(NULL, size, PROT_WRITE, MAP_SHARED, d, 0);
if( a == MAP_FAILED ){
perror( "mmap failed" );
abort();
}
return a;
}
size_t da_fileSize(int d){
struct stat info;
if(fstat(d, &info) == -1) {
perror("fstat failed");
exit(1);
}
return (size_t)info.st_size;
}
int main( int argc, char * argv[] ){
int sk;
int d;
char *data;
size_t s;
if(argc == 3){
sk = atoi(argv[2]);
d = da_open(argv[1]);
s = da_fileSize(d);
data = (char*)da_mmap(d, s);
printf("File Size: %d\n", (int) s);
printf("%d\n", (int) data[sk]);
close(d);
}
return 0;
}
我猜您还需要在您的 mmap 中读取权限:PROT_WRITE | PROT_READ
分段错误是指您尝试访问不属于您的内存space。 它通常发生在数组中(就像你的情况一样)。如果您有一个长度为 5 个元素的数组并且您尝试访问第 6 个元素,您将遇到分段错误并且您的程序将停止。
所以在printf("%d\n", (int) data[sk]);
行你的错误可能是sk中的值太大了,你应该试着打印出来检查一下。
您还应该始终检查系统函数(不是您的函数)的 return,例如您的 open() 或 atoi()。如果 open 失败而你又不停止你的程序,那你将度过一段糟糕的时光:)