gpt4 book ai didi

c - Linux共享内存段错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:44:56 24 4
gpt4 key购买 nike

我一直难以在示例 C 程序 (RHEL 6) 中获得可用的共享内存区域。它应该是非常基本的,所以我不确定我做错了什么,但是当我分配内存区域时,它最初似乎是可以访问的。但是,当我从初始化函数返回时,内存区域不再可访问,当我尝试访问内存区域时出现段错误。

我已经尝试通过 GDB 运行它,但我看到的只是在我尝试执行此 memcpy 的行上的段错误:

memcpy(ptr, &x, sizeof(x));

这可能是我出于某种原因看不到的小事!谢谢。

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <sys/sem.h>
#include <sys/shm.h>
#include <sys/stat.h>
#include <errno.h>


void* shared_mem[2];

int init(int *memAddress);

int main() {

if(init((int*)&shared_mem[0]) < 0) {
printf("Error initializing, exiting\n");
exit(1);
}

int *ptr=shared_mem[0];

int x=278;
memcpy(ptr, &x, sizeof(x));
printf("data written to memAddress: %d\n", shared_mem[0]);

}

// Initialize shared memory region and insert test data
int init(int *memAddress) {
key_t key = 234324;
int size = sizeof(int);
static const unsigned int flags = S_IRUSR | S_IWUSR | S_IRGRP |
S_IWGRP | S_IROTH | S_IWOTH | IPC_CREAT;
int id = shmget(key, size, flags);
if (id < 0)
{
return(-3);
}
*memAddress = shmat(id,0,0);
if ((int)memAddress == -1)
{
return(-4);
}

int z=123;
memcpy(memAddress, &z, sizeof(z));
printf("data written to memAddress: %d\n", memAddress[0]);
return(0);
}

最佳答案

这里有些地方是完全错误的,它以下面一行开头:

int init(int *memAddress)

您将指向 shared_mem 的指针传递给函数“init”。因此 memAddress 将指向 8 或 16 字节(取决于 CPU 类型)数组 shared_mem

*memAddress = shmat(id,0,0);

如果 sizeof(void *) == sizeof(int) 这会起作用,但是您必须进行其他指针转换。 shared_mem[0] 将包含指向内存的指针,转换为 int

如果 sizeof(void *) != sizeof(int) 你这里已经有问题了。

(int)memAddress == -1

这在任何情况下都行不通:

(int)memAddress 是数组 shared_mem 的地址,而不是 shmat 返回的值。

memcpy(memAddress, &z, sizeof(z));

这会将值 123 写入 shared_mem[0]。因此,以下说明:

memcpy(ptr, &x, sizeof(x));

... 将等于:

memcpy((void *)123, &x, sizeof(x));

...这将导致错误。

正确的函数应该是这样的:

int init(void **memAddress) {     // void **
...
*memAddress = shmat(id,0,0); // This was correct!
if ((int)(*memAddress) == -1) // Note the "*"
...
memcpy(*memAddress, &z, sizeof(z)); // Note the "*"
}

关于c - Linux共享内存段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45018431/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com