Я использую 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;
спасибо :)
Deer Ghost-downvoter: объяснить, почему. – nouney
Что это должно делать: 'memcpy (& rbuf-> cp, rbuf + sizeof (int), rbuf-> msglen);'? Где ваш сервер разместил сообщение, которое вы хотите получить? – nos
** (m = shmat (shmid, NULL, 0)) == (message_buf *) -1 ** где m - это ptr для msg_buf. а затем m-> cp = "сообщение, введенное пользователем". Также я изменил ** rbuf-> msglen ** на sizeof (* rbuf), чтобы получить ptr до cp. – user3392539