use*_*539 2 c linux ipc shared-memory
我在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;
}
Run Code Online (Sandbox Code Playgroud)
msgbuf.h是
typedef struct msgbuf1
{
int msglen;
char *cp;
}message_buf;
Run Code Online (Sandbox Code Playgroud)
谢谢 :)
您从共享内存区域读取char*.但是,这指向在远程进程中使用malloc分配的缓冲区.因此,它指向其他进程的本地进程堆.
这只是未定义的行为.
相反,使字符缓冲区成为共享内存数据结构的一部分:
//header files
#define MAX_SH_BUFSIZE 1024
//
typedef struct msgbuf1
{
int msglen;
char cp[MAX_SH_BUFSIZE];
} message_buf;
Run Code Online (Sandbox Code Playgroud)