2014-03-31 4 views
2

Я использую IPC, используя общую память в C linux. Вот мой процесс получения. Он получает правильную длину, но не сообщение. Однако процесс отправки отправляет его правильно. Пожалуйста, посмотрите это и сообщите мне об ошибке.IPC с использованием общей памяти в C

//header files 
#include "/home/user/msgbuf.h" 
#define SHMSZ 127 
int main() 
{ 
    int shmid; 
    key_t key; 
    message_buf *rbuf; 
    rbuf=malloc(sizeof(*rbuf)); 
    key = ftok("/home/user/shmem",17); 

    if ((shmid = shmget(key, SHMSZ, 0666)) < 0) 
    {  perror("shmget"); 
      exit(1); 
    } 
    printf("\nShared Memory Id = %d\n",shmid); 
    if ((rbuf = shmat(shmid, NULL, 0)) == (message_buf *) -1) 
    {  perror("shmat"); 
      exit(1); 
    } 
    printf("\nMEMORY SEGMENT ATTACHED TO THE CLIENT'S PROCESS\n"); 

/* Now read what the server put in the memory */ 
    printf("\nmsglen = %d",rbuf->msglen); //this is correct 
    rbuf->cp=malloc(rbuf->msglen); 
    memcpy(&rbuf->cp,rbuf+sizeof(int),sizeof(*rbuf)); 
    printf("\nMESSAGE :: %s",rbuf->cp); //MESSAGE :: null 
    fflush(stdout); 
    shmdt(&shmid); 
    printf("\nMEMORY SEGMENT %d DETACHED\n",shmid); 
    return 0; 
} 

msgbuf.h является

typedef struct msgbuf1 
{ 
    int msglen; 
    char *cp; 
}message_buf; 

спасибо :)

+0

Deer Ghost-downvoter: объяснить, почему. – nouney

+0

Что это должно делать: 'memcpy (& rbuf-> cp, rbuf + sizeof (int), rbuf-> msglen);'? Где ваш сервер разместил сообщение, которое вы хотите получить? – nos

+0

** (m = shmat (shmid, NULL, 0)) == (message_buf *) -1 ** где m - это ptr для msg_buf. а затем m-> cp = "сообщение, введенное пользователем". Также я изменил ** rbuf-> msglen ** на sizeof (* rbuf), чтобы получить ptr до cp. – user3392539

ответ

5

Читает символ * из общей области памяти. Однако это указывает на буфер, выделенный с помощью malloc, в удаленном процессе. Как таковой он указывает на кучу процесса локального на то, что другой процесс.

Это просто неопределенное поведение.

Вместо этого сделать буфер символов часть общей структуры данных памяти:

//header files 
#define MAX_SH_BUFSIZE 1024 
// 
typedef struct msgbuf1 
{ 
    int msglen; 
    char cp[MAX_SH_BUFSIZE]; 
} message_buf; 
+0

не могу сделать его динамичным. Я имею в виду использование * cp вместо массива символов. и вот почему я использовал memcpy в моей проге выше – user3392539

+0

№ Как он сказал, буфер, возвращаемый malloc, является частным процессом, который его назвал. –

+1

@ JonathonReinhart мне это не имеет смысла. Почему он должен делиться непрозрачными указателями, которые не относятся к одному и тому же пространству процессов? Кроме того, он вызывает memcpy. Таким образом, либо это (как я опишу в своем ответе), либо OP полностью смущен относительно того, что такое макет структуры и как функционирует член 'cp'. Чем больше я смотрю на код, я думаю, что это и – sehe

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