C UBUNTU在VMWARE上出现分段故障(内核转储)
对不起,如果我的英语很糟糕:我真的很紧张:( 我正在使用Ubuntu 11.04作为虚拟机。使用VMWARE作为虚拟机的操作系统是windows 7。 我正试图在linux上用C语言编写一个程序:使用共享内存。当我试图编译时没有错误,但当我执行它时,我看到一个类似这样的错误: 分段故障(堆芯转储) 我不确定,但据我所知,VMWARE导致了以下情况:S 代码如下:C UBUNTU在VMWARE上出现分段故障(内核转储),c,linux,ubuntu,vmware,C,Linux,Ubuntu,Vmware,对不起,如果我的英语很糟糕:我真的很紧张:( 我正在使用Ubuntu 11.04作为虚拟机。使用VMWARE作为虚拟机的操作系统是windows 7。 我正试图在linux上用C语言编写一个程序:使用共享内存。当我试图编译时没有错误,但当我执行它时,我看到一个类似这样的错误: 分段故障(堆芯转储) 我不确定,但据我所知,VMWARE导致了以下情况:S 代码如下: #include<stdio.h> #include<sys/wait.h> //Process wai
#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;
}
#包括
#包含//进程等待
#包含//文件
//#包括
//#包括
int main(){
printf(“\n我们开始…!”);
整数*数字;
Numbers=(int*)getmem(327);//共享内存
inti,ProcID;
ProcID=fork();//离开处理器
如果(ProcID==0){//子处理器
对于(i=0;i假设getmem
将字节数作为参数,则为数字数组分配327个字节:
Numbers=(int*)getmem(327);
如果您在一个具有8字节int
的64位系统上,这足够容纳40个整数
然后,您继续在该数组中放入50个数字,超出了分配的空间。这很可能会导致分段错误
通常,在调试器中启动程序以查看分段错误的确切发生位置。这样,您可以更轻松地在程序中定位错误。假设getmem
将字节数作为参数,则为数字数组分配327个字节:
Numbers=(int*)getmem(327);
如果您在一个具有8字节int
的64位系统上,这足够容纳40个整数
然后,您继续在该数组中放入50个数字,超出了分配的空间。这很可能会导致分段错误
通常,在调试器中启动程序以查看分段错误的确切发生位置。这样,您可以更轻松地找到程序中的错误。正如Marc B所说,问题在于VMWare。我在真实的操作系统上尝试了它,它起了作用。getmem()函数不是我自己的函数。要使用它,必须添加“-shared”在编译行的末尾。感谢您的回复…正如Marc B所说,问题在于VMWare。我在一个真实的操作系统上试用了它,它成功了。getmem()函数不是我自己的函数。要使用它,您必须添加“-shared”在编译行的末尾。感谢您的回复…对于VMware来说,出现这样的错误是非常奇怪的。显然,请在“真实”的基础上尝试代码Linux安装未在VMware下运行,有待确认。更有可能的情况是,您的代码中有一个bug。thx如果可行,我将尝试此方法。我会让您知道……这是程序中的一个bug,不是VMware的错误。您应该发布getmem()函数。您可能应该检查它是否失败。open()也是如此调用时,它们可能会失败。如果我没有任何想法(尽管这一点很明显,正如sth所指出的),我的第一个操作将是在Valgrind下运行我的程序:)…无需麻烦且轻松地跟踪错误。VMware会导致这样的错误,这将是非常奇怪的。显然,请在“真实”环境下尝试代码Linux安装未在VMware下运行,有待确认。更有可能的情况是,您的代码中有一个bug。thx如果可行,我将尝试此方法。我会让您知道……这是程序中的一个bug,不是VMware的错误。您应该发布getmem()函数。您可能应该检查它是否失败。open()也是如此如果我没有任何想法(尽管这一点很明显,正如sth所指出的),我的第一个行动就是在Valgrind下运行我的程序:)…无需麻烦且轻松地跟踪bug。