我们有几个使用共享内存进行通信的 C 应用程序。第一个应用程序添加消息,第二个应用程序始终从共享内存中读取。
struct messagestruct {
unsigned int sessionid;
uint8_t message[16]; //unsigned 8bit int
}__attribute__ ((__packed__));
我们需要 3 个 session (针对 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
感谢您提供任何有用的信息。
最佳答案
memcpy(shmaddr, currentsessionsstruct, SHARED_SIZE);
您正在复制3 * sizeof(messagestruct) + sizeof(int)
。我相信您只想复制 sizeof(currentsessionstruct)
。
关于size - valgrind - 无效的写入大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6251303/