2015-12-05 3 views
-1

Кто-нибудь знает, почему я получаю сообщение «segmentation fault (core dumped)»? Что не так? Мне кажется, что проблема связана с массивом. Я знаю, что «ошибка сегментации» означает, что я пытался получить доступ к памяти, к которой у меня нет доступа.ошибка сегментации (ядро сбрасывается) - что не так в моем коде

#include <stdio.h> 
#include <sys/ipc.h> 
#include <sys/shm.h> 
#include <sys/types.h> 
#include <unistd.h> 

int main(int argc, const char* argv[]) 
{ 
    int shmid; 
    int i, j; 
    int glos; 
    pid_t pid; 
    key_t key; 
    long *wyniki; 

    key = ftok("/home/sebastian", 2); 

    shmid = shmget(key, 20 * sizeof(long), IPC_CREAT); 

    if (shmid == -1) { 
     printf("Error - New memory segment"); 
    } 
    else { 
     printf("My memory segment: %d\n", shmid); 
     wyniki = (long*) shmat(shmid, 0, 0); 

     for (i = 0; i < 5; i++) { 
      wyniki[i] = 0; 
     } 

     // Creating new processes 
     for (i = 0; i < 20; i++) { 
      pid = fork(); 
      if (pid == 0) { 
       srand48(time(NULL) + getpid()); 
       for (j = 0; j < 1000000; j++) { 
        glos = rand() % 5; 
        wyniki[glos] += 1; 
       } 
      } 
      else { 
       printf("ERROR - PROCESSES"); 
      } 
     } 
    } 

return 0; 
} 
+3

Вы использовали GDB? Каковы были значения переменных перед сегрегацией? Успешно ли «ftok»? Вы должны [проверить его возвращаемое значение] (http://pubs.opengroup.org/onlinepubs/009695399/functions/ftok.html#tag_03_198_04) на всякий случай. –

+2

скомпилируйте программу с помощью -g, запустите ее с помощью gdb, это покажет вам, что она не работает – pm100

+0

'ftok' no returns -1. –

ответ

4

Вы создали сегмент разделяемой памяти без правильной установки битов разрешения, поэтому у вас нет доступа к памяти.

согласно shmget()man page:

int shmget(key_t key, size_t size, int shmflg); 
    ... 
    In addition to the above flags, the least significant 9 bits of 
    shmflg specify the permissions granted to the owner, group, and 
    others. These bits have the same format, and the same meaning, as 
    the mode argument of open(2). Presently, execute permissions are not 
    used by the system. 

Вы должны указать разрешения для общего сегмента памяти:

shmid=shmget(key, 20 * sizeof(long), IPC_CREAT | 0600); 

Или используйте 0640, 0660 или символьные режимы.

Но сначала вам, вероятно, придется удалить существующий сегмент, используя ipcrm.

+0

Так вот почему. Но shmget дает мне -1 значение. Это связано с существующим сегментом? –

+0

@ Se-BASS-tian Возможно. Посмотрите на вывод из 'ipcs -m' и удалите все сегменты, принадлежащие вашей учетной записи, если вы не используете их как root, и нет целых других сегментов разделяемой памяти, которые существуют для других целей. См. Http://man7.org/linux/man-pages/man1/ipcs.1.html –

0

, чтобы исправить `слишком много процессов, созданную проблему:

изменение этого:

// Creating new processes 
    for (i = 0; i < 20; i++) { 
     pid = fork(); 
     if (pid == 0) { 
      srand48(time(NULL) + getpid()); 
      for (j = 0; j < 1000000; j++) { 
       glos = rand() % 5; 
       wyniki[glos] += 1; 
      } 
     } 
     else { 
      printf("ERROR - PROCESSES"); 
     } 
    } 

к этому:

// Creating new processes 
    for (i = 0; i < 20; i++) 
    { 
     pid = fork(); 
     if (pid == 0) 
     { // child process 
      srand48(time(NULL) + getpid()); 
      for (j = 0; j < 1000000; j++) 
      { 
       glos = rand() % 5; 
       wyniki[glos] += 1; 
      } 
      exit(); 
     } 

     else if(0 > pid) 
     { // error occurred 
      perror("fork() failed"); 
      printf("ERROR - PROCESSES\n"); 
     } 

     //else 
     //{ // parent process 
     // ; 
     //} 
    } // end: for 20 child processes 
+0

Я исправил его несколько часов назад, точно так же, как и сейчас. :) –

Смежные вопросы