【问题标题】:mmap and memcpy usage and Segmentation Fault (core dumped) errormmap 和 memcpy 使用和分段错误(核心转储)错误
【发布时间】:2015-05-03 13:20:04
【问题描述】:

我有两个文件,我想使用 memcpy 将一个文件内容复制到另一个文件。但我收到此错误Segmentation Fault (core dumped)。我的主要

int main( int argc, char * argv[] ){
    int d1;
    int d2;
    char *a;
    char *b;
    d1 = da_open_r(argv[1]); // open file READ ONLY
    d2 = da_open_w(argv[2]); //  open file to WRITE
    a = (char*)da_mmap(d1); // map first file
    b = (char*)da_mmap(d2); // map second file
    memcpy(b, a, 10); // I think this line is bad
    kp_test_munamp(a, 10 ); // 
    kp_test_munamp(b, 10 );
    kp_test_close(d1); // close 1 file
    kp_test_close(d2); // close 2 file
    return 0;
}

这是我的da_mmapkp_test_munamp

void *da_mmap(int d){
    mmap(NULL, 10, PROT_READ|PROT_WRITE, MAP_SHARED, d, 0);
}

int kp_test_munamp( void *a, int size ){
   int rv;
   rv = munmap( a, size );
   if( rv != 0 ){
      puts( "munmap failed" );
      abort();
   }
   return 1;
}

我已经尝试解决这个问题将近两个小时,但我仍然不知道出了什么问题。 编辑我的完整代码

#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_r(const char *name);
int da_open_w(const char *name);
void *da_mmap(int d);
int kp_test_munamp( void *a, int size );
int kp_test_close(int fd);

int da_open_r(const char *name){
    int dskr;
    dskr = open( name, O_RDWR );
    if( dskr == -1 ){
      perror( name );
      exit( 255 );
    }
    printf( "dskr1 = %d\n", dskr );
    return dskr;
}

int da_open_w(const char *name){
    int dskr;
    dskr = open( name, O_RDWR );
   if( dskr == -1 ){
      perror( name );
      exit( 255 );
   }
   printf( "dskr2 = %d\n", dskr );
   return dskr;
}

void *da_mmap(int d){
     void *a = NULL;
     a = mmap(NULL, 10, PROT_WRITE, MAP_SHARED, d, 0);
     if( a == MAP_FAILED ){
          perror( "mmap failed" );
          abort();
     }
     return a;
}

int kp_test_munamp( void *a, int size ){
   int rv;
   rv = munmap( a, size );
   if( rv == -1 ){
      puts( "munmap failed" );
      abort();
   }
   return 1;
}

int kp_test_close(int fd){
   int rv;
   rv = close( fd );
   if( rv != 0 ) perror ( "close() failed" );
   else puts( "closed" );
   return rv;
}

int main( int argc, char * argv[] ){
    int d1;
    int d2;
    char *a;
    char *b;
    d1 = da_open_r(argv[1]); // read only
    d2 = da_open_w(argv[2]); //  WRITE
    a = (char*)da_mmap(d1);
    b = (char*)da_mmap(d2);
    memcpy(b, a, 10); // I think this line is bad
    kp_test_munamp(a, 10 );
    kp_test_munamp(b, 10 );
    kp_test_close(d1);
    kp_test_close(d2);
    return 0;
}

【问题讨论】:

  • 您是否在检查所有文件相关操作是否成功?
  • 使用-Wall -Wextra -pedantic时,代码编译是否没有警告?
  • 您是否在调试器中跟踪您的代码以识别它崩溃的源代码行?使用选项-g 编译,然后运行gbd yourprogramname,执行b main &lt;enter&gt;,然后执行r &lt;enter&gt;,然后使用t &lt;enter&gt; 逐行跟踪。你会喜欢的。
  • 我没有堆栈!但为什么?我认为 main 中的所有变量都在堆栈中。怎么可能没有栈!?
  • 可能有陈旧的共享内存段,作为程序的各种测试运行的剩余部分。使用命令行工具ipcs 对此进行检查。删除那些使用ipcrm

标签: c segmentation-fault mmap memcpy coredump


【解决方案1】:

da_mmap() 不返回任何内容!这导致 ab 的值是垃圾,并且这很可能指向无效内存,这反过来又使 memcpy() 在对其进行操作时失败。

添加返回语句

void * da_mmap(int d) {
  return mmap(NULL, 10, PROT_READ|PROT_WRITE, MAP_SHARED, d, 0);
}

您还应该通过以下方式测试映射的结果:

{
  void * pvtmp = da_mmap(d1); // map first file
  if (MAP_FAILED == pvtmp)
  {
    perror("da_mmap() failed");
    exit(1);
  }

  a = pvtmp;
}    

b 也一样。


引用munmap() 周围的包装器。在此处更正错误测试。然而,按照惯例,返回0 表示成功(返回-1 表示失败)。

【讨论】:

  • 感谢您的回答!但我还是遇到了同样的问题。
  • 我得到同样的错误 Segmentation Fault (core dumped)
  • @David:你确定你重新编译了所有东西吗,对不起?
  • 是的。我还编辑了我的问题并粘贴了我的所有代码。
  • @David:我这边无法重现,您的代码有效。
猜你喜欢
  • 2015-06-13
  • 1970-01-01
  • 2014-02-05
  • 2014-08-04
  • 2012-11-19
  • 1970-01-01
  • 1970-01-01
  • 2015-06-25
相关资源
最近更新 更多