我正在尝试在进程之间共享内存,以“有效地”计算来自具有随机数字串的文件的字符串重复。所以,让我们说我用char **单词得到所有这些,我想要分享两个不同类型的变量(WordStruct shared和int shared_length),第一个引用具有字符串位置的结构在单词和它的出现,而第二个引用不同的字符串数量。这是因为我想迭代共享并知道何时停止,但是,当我尝试将shared_length设置为某个值时,会出现问题。
这是我的代码:
typedef struct wordSturct {
int word_id;
int count;
} WordStruct;
/* open file */
int index = 0;
char* word = malloc(sizeof(char) * 257);
char** words = malloc(sizeof(char*) * buffer) /* lets say buffer is way to big */
while (fscanf(fp, "%s", word) == 1) { /* fp is a FILE* */
words[index] = malloc(sizeof(char) * 257);
strcpy(words[index], word);
index++;
}
key_t key = ftok("/tmp", 'F');
int identifier = shmget(key, sizeof(WordStruct) * index + sizeof(int), IPC_CREAT | SHM_W | SHM_R);
void* shared_memory = shmat(identifier, NULL, 0);
WordStruct* shared = (WordStruct *) shared_memory;
int* shared_length = (int *) (shared + sizeof(WordStruct) * index);
从这里开始,我将使用一些测试代码来确保共享内存段的正确功能,因此我们认为没有重复的单词,因此迭代共享直到索引是正确的:
for (int i=0; i < index; i++) {
shared[i].word_id = i;
shared[i].count = 0;
}
在此之前,所有内容都被接受并正确实例化,但之后我尝试这样做:
*shared_length = 0; /* main.c:125 */
我根据VALGRIND得到以下错误:
写入大小4无效
在0x400F11:main(main.c:125) 地址0x40d1400未堆叠,malloc'd或(最近)免费
使用信号11(SIGSEGV)的默认操作终止的进程
不在地址0x40D1400的映射区域内访问 在0x400F11:main(main.c:125) ...
分段故障(核心转储)
我试图设置一个WrapperStruct来分配shmat()函数,这样我就可以只有一个结构,但是我甚至需要知道索引值才打开文件以获得我的数组,所以这不是一个选项我认为。
当您对指针进行算术运算时,它将以指针指向的对象大小为单位执行。因此,您不需要乘以sizeof(WordStruct)
- 这会导致它乘以两次,并且您将超出共享内存。它应该是:
int* shared_length = (int *) (shared + index);
要么
int *shared_length = (int *)&shared[index];