2015-05-12 4 views
2

У меня проблема при запуске моего кода. Мой shmat терпит неудачу и отпечатанное разрешение отклонено. Я искал в Google, как это решить, но я не могу. Мой код выглядит следующим образом:c программирование разрешение shmat() отклонено

#include <stdio.h> 
#include <sys/ipc.h> 
#include <sys/shm.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <stdlib.h> 
#include <unistd.h> 
#define ERROR -1 

int main (int argc, char *argv[]) { 
    int shmid,key=50; 
    int *val; 
    int *x; 
    int rw = -1; 

    // 0 for write and 1 for read 

    shmid = shmget (key, sizeof(int), IPC_CREAT); 

    if (shmid == -1) { 
     perror ("Error in shmget\n"); 
     return (ERROR); 
    } 

    val = (int *) shmat (shmid, NULL, 0); 

    if (val == -1) { 
     perror ("Error in shmat\n"); 
     return (ERROR); 
    } 

    scanf ("%d", &rw); 

    while (rw >= 0) { 
     if (rw == 0) { 
      //write in the shared memory 
      x = (int *) malloc (sizeof (int)); 

      if (x == NULL) { 
       perror ("Error in malloc"); 
       return (ERROR); 
      } 

      scanf ("%d", x); 

      val = x; 

     } 
     else { 
      // read from the shared memory 
      if (rw == 1) { 
       printf ("%d\n", *val); 
      } 
     } 

     scanf ("%d", &rw); 
    } 

    return (0); 

} 

В этом коде я хочу протестировать общую память. Я пишу целое число в разделяемой памяти, когда я даю rw = 1 else. Я читаю значение общей памяти, а затем печатаю это значение. Я не могу найти, где проблема ....

+0

1) при вызове зсапЕ(), и семейство функций, всегда проверять возвращаемое значение (а не параметры), чтобы обеспечить операция была успешной. 2) в C, не отбрасывайте возвращаемое значение из malloc() и семейства функций. – user3629249

+0

при запуске опубликованного кода пользователь не имеет указаний на то, что единственными допустимыми входными значениями являются 1 и 0. Все пользователи видят запрос. Кроме того, если бы пользователь вводил только новую строку, опубликованный код попытается обработать то, что когда-либо происходит в памяти в переменной «* x». – user3629249

+0

каждый раз, когда пользователь вводит 0, выполняется другой malloc, накладывая указатель на предыдущий указатель malloc (что приводит к утечке памяти) I.E. каждый раз, когда должен выполняться malloc, за исключением первого раза, предыдущий выделенный указатель памяти должен быть передан в free(). Примечание: если «x» инициализируется значением NULL, он всегда может передать «x» на бесплатную() – user3629249

ответ

0

У вас также есть ошибка здесь:

val = x; 

должно быть:

*val = *x; 
5

Вы создали сегмент разделяемой памяти с разрешениями набора в 0000:

shmid = shmget (key, sizeof(int), IPC_CREAT); 

должен быть

shmid = shmget (key, sizeof(int), IPC_CREAT | 0660); 

или аналогичный.

+0

У этого тоже есть проблема. Я попробовал это. Моя проблема в shmat –

+0

всегда полезно прочитать руководство (справочную страницу) для любой системной функции, используемой вашим кодом. – user3629249

+0

@ ΧρήστοςΓεωργακίδης - сегмент разделяемой памяти по-прежнему существует с разрешениями 0000.Что показывает 'ipcs -q'? Если он все еще существует, вы можете использовать 'ipcrm', чтобы удалить его. –

1

помимо проблемы с вызовом shmget(), как описано в другом ответе

И многочисленные проблемы с кодом, который читает/пишет некоторое целое число

тот факт, что ОП все еще получаю " разрешение отказано»сообщение, потому что разделяемая память имеет

1) not been detached -- see the man page for shmdt() 
2) not been destroyed -- see the man page for shmctl() 

исправить эти две проблемы и общие операции с памятью будет работать хорошо.

Однако, как уже упоминалось в комментариях, есть много других проблем, с посланной кодом

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