【发布时间】:2012-02-21 15:11:44
【问题描述】:
// reading
if((shmid = shmget(key, 0, 0)) < 0) {
perror("shmget");
exit(50);
}
// attach
if((data = shmat(shmid, (void *)0, 0)) == (char *) -1) {
perror("shmat");
exit(100);
}
// get memory size
struct shmid_ds shm_info;
size_t shm_size;
int shm_rc;
if((shm_rc = shmctl(shmid, IPC_STAT, &shm_info)) < 0)
exit(101);
shm_size = shm_info.shm_segsz;
有时数据不是以空值终止的,调用 strlen(data) 会导致段错误...
所以我试图通过 make 来确保它是空终止的
data[shm_size] = '\0';
但现在有时它会在该行代码上失败。
我做错了什么?
编辑:感谢您的支持!我认为在您对 strlen() + 1 == shm_size 的解释之后,我已经更改了未在此处发布的其余代码,并且似乎很好。我正在等待新的段错误,希望我不会得到任何;)
【问题讨论】:
-
告诉我你是如何为
data定义和分配空间的。我猜是由不正确的内存分配引起的问题。data数组可能需要 +1 个字节的空间。 -
是的,您正在对非字符串对象调用字符串函数。这是第一个问题,这表明您在开始解决此问题的其余部分之前需要阅读更多内容。
-
PHP 正在使用 shmop 填充共享内存...我确信它包含字符串,因为当我使用 gdb 检查核心转储时,我可以看到数据的内容。 ..
-
你也能看到尺寸吗? GDB 可能只会向您显示您指定的数据量(例如 x/3xb 只给您 3 个字节)。即使是“打印”函数也可能并不总是检查字符串的大小,而是打印到“\0”字符,这可能是在你的“字符串”之后偶然出现的,所以看起来它是 NULL 终止的。
-
不行,制作gdb后> 设置打印元素0,在文本末尾我可以看到地址xxx超出范围错误...
标签: c memory-leaks shared-memory