VMWARE分段上的UBUNTU分段故障(核心转储)

时间:2011-05-25 15:07:07

标签: c linux ubuntu vmware

抱歉,如果我的英语太可怕了:我真的很累:( 我正在使用Ubuntu 11.04作为虚拟机。使用VMWARE作为虚拟机操作系统是Windows 7。 我正在尝试使用C语言在linux上编写程序:使用共享内存。当我尝试编译时没有错误但是当我执行它时,我看到如下错误:     分段故障(核心转储) 我不确定,但据我所知,VMWARE导致了这个问题:S 这是代码:

#include<stdio.h>
#include<sys/wait.h>    //Process wait
#include <fcntl.h>  //File
//#include <cstdlib>
//#include<fstream.h>

int main(){

  printf("\n Here we go...!");
  int *Numbers;
  Numbers=(int*)getmem(327); // shared memory

  int i,ProcID;
  ProcID=fork(); //depart processor

  if(ProcID==0){          // child processor
    for(i=0;i<50;i++){
      Numbers[i]=random()%50;   
    }
  }else if(ProcID<0){
    printf("\n Hmm... There is an error!");
  }

  int Waiting;
  wait(&Waiting);   

  if(ProcID>0){          // parent processor

    int fileeven,fileodd;
    fileeven=open("EK_even.txt",O_RDWR|O_CREAT,0600);
    fileodd=open("EK_odd.txt",O_RDWR|O_CREAT,0600);

    for(i=0;i<50;i++){
      if(Numbers[i]%2==0){
    write(fileeven,&Numbers[i],sizeof(Numbers[i]));
      }else{
    write(fileodd,&Numbers[i],sizeof(Numbers[i]));
      }
    }

    close(fileeven);
    close(fileodd);

  }else if(ProcID<0){
    printf("\n Hmm... There is an error!");
  }
  return 1;
}

我正在使用它在终端上编译:gcc -o ./RUN ./EK.c-shared                 运行:./ RUN                 结果:分段错误(核心转储)

感谢您的时间和响应,我真的需要......

2 个答案:

答案 0 :(得分:4)

假设getmem将多个字节作为参数,则为您的数组分配327个字节:

Numbers=(int*)getmem(327);

如果您使用的是具有8字节int的64位系统,则这足以容纳40个整数。

然后继续将50个数字放入该数组中,超过为其分配的空间。这可能会导致分段错误。

通常,在调试器中启动程序以查看分段错误发生的确切位置。这样您就可以更轻松地在程序中找到错误。

答案 1 :(得分:1)

问题是VMWare,正如Marc B所说。我在一个真正的操作系统上试用它并且它有效。 getmem()函数不是我自己的函数。要使用它,你必须在编译行的末尾添加“-shared”。谢谢回复...