【发布时间】:2014-03-31 11:15:51
【问题描述】:
我正在使用 C linux 中的共享内存实现 IPC。这是我的接收过程。它正在接收正确的长度,但不是消息。但是发送过程正在正确发送它。 请查看此内容并让我知道错误。
//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:解释原因。
-
这是做什么的:
memcpy(&rbuf->cp,rbuf+sizeof(int),rbuf->msglen);?您的服务器将您想要接收的消息放在哪里? -
(m = shmat(shmid, NULL, 0)) == (message_buf *) -1 其中 m 是指向 msg_buf 的指针。然后 m->cp="用户输入的消息"。此外,我已将 rbuf->msglen 更改为 sizeof(*rbuf) 以将 ptr 更改为 cp。
-
@user3392539 您在
rbuf->cp=malloc(rbuf->msglen);中覆盖了cp,所以您肯定不能指望该指针再包含该消息。此外,指针对于进程来说是本地的,不能跨共享内存传输指针,因为指针只在创建它的进程中有效。
标签: c linux ipc shared-memory