问题描述
||
抱歉,如果我的英语太糟了:我真的很努力:(
我正在使用充当虚拟机的Ubuntu 11.04。 Windows 7使用VMWARE作为虚拟机操作系统。
我正在尝试使用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\",0600);
for(i=0;i<50;i++){
if(Numbers[i]%2==0){
write(fileeven,&Numbers[i],sizeof(Numbers[i]));
}else{
write(fileodd,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
结果:分段故障(核心已转储)
感谢您的宝贵时间并回复我,我真的很需要...
解决方法
假设ѭ1接受一个字节数作为参数,则为数字数组分配327个字节:
Numbers=(int*)getmem(327);
如果您使用的是8字节int
的64位系统,则该空间足以容纳40个整数。
然后,您将50个数字放入该数组中,这超出了分配的空间。这很可能会导致分段错误。
通常,在调试器中启动程序以查看分段错误的确切位置。这样,您可以更轻松地在程序中定位错误。
,正如Marc B所说,问题是VMWare。我在真正的操作系统上进行了尝试,并且可以正常工作。 getmem()函数不是我自己的函数。要使用它,您必须在编译行的末尾添加\“ shared \”。感谢您的回覆...