UBUNTU в VMWARE Ошибка сегментации (ядро сброшено) - PullRequest
0 голосов
/ 25 мая 2011

извините, если мой английский ужасен: я очень переживаю :( Я использую 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(&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 ]

4 голосов
/ 25 мая 2011

Предполагая, что getmem принимает количество байтов в качестве параметра, вы выделяете 327 байтов для вашего массива чисел:

Numbers=(int*)getmem(327);

Если вы работаете в 64-битной системе с 8-байтовым int, этого места достаточно для 40 целых чисел.

Затем вы продолжаете помещать в этот массив 50 чисел, больше, чем выделено место.Это может очень хорошо вызвать ошибку сегментации.

Как правило, запустите вашу программу в отладчике, чтобы увидеть, где именно происходит ошибка сегментации.Таким образом, вы можете легче найти ошибку в вашей программе.

1 голос
/ 30 мая 2011

Проблема в VMWare, как сказал Марк Б.Я попробовал это на реальной операционной системе, и это сработало.Функция getmem () не является моей собственной функцией.Чтобы использовать его, вы должны добавить «-shared» в конце строки компиляции.Спасибо за ответы ...

...