我们有几个使用共享内存进行通信的C应用程序。第一个应用程序添加消息,第二个应用程序始终从共享内存中读取。
struct messagestruct {
unsigned int sessionid;
uint8_t message[16]; //unsigned 8bit int
}__attribute__ ((__packed__));
我们需要有3个会话(3个用户)。如此定义的共享内存大小为
#define SHARED_SIZE ( 3 * sizeof(messagestruct)) + sizeof(int)
我们以
的形式访问共享内存int sesskey = ftok("/path/to/a/file", "B");
int shmemoryid = shmget(sesskey, SHARED_SIZE, 0666 | IPC_CREAT);
在将结构复制到共享内存期间,valgrind报告错误(写入大小无效1)
void *shmaddr = shmat(shmemoryid, NULL, 0);
int *sessnum;
struct messagestruct *msgstruct;
sessnum = (int *)shmaddr;
msgstruct = (struct messagestruct*)((void*) shmaddr + sizeof(int));
memcpy(shmaddr, currentsessionsstruct, SHARED_SIZE); //-->valgrind error invalid write size 1
感谢任何有用的信息。
答案 0 :(得分:3)
memcpy(shmaddr, currentsessionsstruct, SHARED_SIZE);
您正在复制3 * sizeof(messagestruct) + sizeof(int)
。我相信你只想复制sizeof(currentsessionstruct)
。