抱歉,如果我的英语太可怕了:我真的很累:( 我正在使用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 结果:分段错误(核心转储)
感谢您的时间和响应,我真的需要......
答案 0 :(得分:4)
假设getmem
将多个字节作为参数,则为您的数组分配327个字节:
Numbers=(int*)getmem(327);
如果您使用的是具有8字节int
的64位系统,则这足以容纳40个整数。
然后继续将50个数字放入该数组中,超过为其分配的空间。这可能会导致分段错误。
通常,在调试器中启动程序以查看分段错误发生的确切位置。这样您就可以更轻松地在程序中找到错误。
答案 1 :(得分:1)
问题是VMWare,正如Marc B所说。我在一个真正的操作系统上试用它并且它有效。 getmem()函数不是我自己的函数。要使用它,你必须在编译行的末尾添加“-shared”。谢谢回复...