#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 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(amp;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,amp;Numbers[i],sizeof(Numbers[i]));
}else{
write(fileodd,amp;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
в результате: ошибка сегментации (сброс ядра)
Спасибо за ваше время и ответы, которые мне действительно нужны…
Комментарии:
1. Было бы очень, очень странно, если бы VMware вызвала подобную ошибку. Очевидно, попробуйте код на «реальной» установке Linux, не работающей под управлением VMware, для подтверждения. Гораздо более вероятно, что в вашем коде есть ошибка.
2. спасибо за совет, я попробую это, если сработает, я дам вам знать…
3. Это ошибка в программе, это не вина VMware. Вы должны опубликовать свою функцию getmem(). И, вероятно, вам следует проверить, не происходит ли сбой. То же самое для вызовов open (), они могут завершиться ошибкой.
4. Моим первым действием, если у меня нет никакой идеи (хотя это было очевидно, как указал sth), было бы запустить мою программу под Valgrind 🙂 … беспроблемное и простое отслеживание ошибок.
Ответ №1:
Предполагая, что getmem
в качестве параметра используется количество байт, вы выделяете 327 байт для вашего массива чисел:
Numbers=(int*)getmem(327);
Если вы используете 64-разрядную систему с 8-байтовым int
, этого места достаточно для 40 целых чисел.
Затем вы добавляете в этот массив 50 чисел, что больше, чем вы выделили для места. Это вполне может вызвать ошибку сегментации.
Как правило, запускайте свою программу в отладчике, чтобы увидеть, где именно возникает ошибка сегментации. Таким образом, вам будет легче найти ошибку в вашей программе.
Ответ №2:
Проблема в VMware, как сказал Марк Б. Я попробовал это в реальной операционной системе, и это сработало. функция getmem() не является моей собственной функцией. Чтобы использовать его, вы должны добавить «-shared» в конце строки компиляции. Спасибо за ответы…