inv*_*try 0 c linux gdb shared-memory
我在样本C程序(RHEL 6)中获取可用的共享内存区域时遇到了困难.它应该是非常基本的,所以我不确定我做错了什么,但是当我分配内存区域时,它似乎最初是可访问的.但是,当我从初始化函数返回时,内存区域不再可访问,当我尝试访问内存区域时,我得到了段错误.
我试过通过GDB运行它,所有我看到的是我试图做这个memcpy的行上的段错误:
memcpy(ptr, &x, sizeof(x));
Run Code Online (Sandbox Code Playgroud)
这可能是我看不出的一些小问题!谢谢.
#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);
}
Run Code Online (Sandbox Code Playgroud)
这里有些东西是完全错误的,它从以下行开始:
int init(int *memAddress)
Run Code Online (Sandbox Code Playgroud)
您将指针传递shared_mem给函数"init".因此memAddress将指向8或16字节(取决于CPU类型)阵列shared_mem.
*memAddress = shmat(id,0,0);
Run Code Online (Sandbox Code Playgroud)
如果sizeof(void *) == sizeof(int)这可行,那么你必须做其他指针转换.shared_mem[0]将包含指向内存的指针,转换为int.
如果sizeof(void *) != sizeof(int)你这里已经有问题了.
(int)memAddress == -1
Run Code Online (Sandbox Code Playgroud)
这在任何情况下都不起作用:
(int)memAddress是数组的地址,shared_mem而不是返回的值shmat.
memcpy(memAddress, &z, sizeof(z));
Run Code Online (Sandbox Code Playgroud)
这会将值123写入shared_mem[0].因此以下说明:
memcpy(ptr, &x, sizeof(x));
Run Code Online (Sandbox Code Playgroud)
......将等于:
memcpy((void *)123, &x, sizeof(x));
Run Code Online (Sandbox Code Playgroud)
......会导致错误.
正确的函数如下所示:
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 "*"
}
Run Code Online (Sandbox Code Playgroud)