У меня проблема при запуске моего кода. Мой 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. Я читаю значение общей памяти, а затем печатаю это значение. Я не могу найти, где проблема ....
1) при вызове зсапЕ(), и семейство функций, всегда проверять возвращаемое значение (а не параметры), чтобы обеспечить операция была успешной. 2) в C, не отбрасывайте возвращаемое значение из malloc() и семейства функций. – user3629249
при запуске опубликованного кода пользователь не имеет указаний на то, что единственными допустимыми входными значениями являются 1 и 0. Все пользователи видят запрос. Кроме того, если бы пользователь вводил только новую строку, опубликованный код попытается обработать то, что когда-либо происходит в памяти в переменной «* x». – user3629249
каждый раз, когда пользователь вводит 0, выполняется другой malloc, накладывая указатель на предыдущий указатель malloc (что приводит к утечке памяти) I.E. каждый раз, когда должен выполняться malloc, за исключением первого раза, предыдущий выделенный указатель памяти должен быть передан в free(). Примечание: если «x» инициализируется значением NULL, он всегда может передать «x» на бесплатную() – user3629249