当前位置: 首页 > 面试题库 >

共享内存段中的指针

曹乐意
2023-03-14
问题内容

我已经尝试了好几个小时,并且用谷歌搜索了所有我想到的东西,但是我快要疯了。

我有一个结构:

typedef struct {
  int rows;
  int collumns;
  int* mat;
  char* IDs_row;
} mem;

直到以后,我才知道int (矩阵)和char 的大小。

完成后,我将创建共享内存,如下所示:

mem *ctrl;
int size = (2 + ((i-1)*num_cons))*sizeof(int) + i*26*sizeof(char); //I have the real size now
shmemid = shmget(KEY, size, IPC_CREAT | 0666);
if (shmemid < 0) {
    perror("Ha fallado la creacion de la memoria compartida.");
    exit(1);
}
ctrl = (mem *)shmat(shmemid, 0, 0);
if (ctrl <= (mem *)(0)) {
    perror("Ha fallado el acceso a memoria compartida");
    exit(2);
}

没问题 然后,我给ctrl-> rows和collumns赋一个值,并将0赋给所有矩阵。

但是之后,我在char *和bam中写了一些段错误。

调试程序时,我看到mat和IDs_row这两个指针都为null。如何在共享内存段内为它们提供正确的值?

我试图删除char *指针,只是想尝试一下,然后在连接到所述共享内存的另一个程序中出现了段错误错误,并且只是检查了矩阵内的值(检查->行和->
collumns是否为成功)


问题答案:
ctrl = (mem *)shmat(shmemid, 0, 0);

这仅将有效内存分配给ctrl指针,而不分配给ctrl->matctrl->IDs_row

您可能想要:

mem *ctrl;
shmemid = shmget(KEY, sizeof(ctrl), IPC_CREAT | 0666);
//allocate memory for the structure
ctrl = (mem *)shmat(shmemid, 0, 0);

//allocate memory for the int*
shmemid = shmget(KEY,((i-1)*num_cons))*sizeof(int), IPC_CREAT | 0666);
ctrl->mat = (int*)shmat(shmemid, 0, 0);

//allocate memory for the char*
shmemid = shmget(KEY,i*26*sizeof(char), IPC_CREAT | 0666);
ctrl->IDs_row = (char*)shmat(shmemid,0,0);


 类似资料:
  • 我一直在谷歌搜索这个问题,但还没有找到一个明确的答案,所以我希望有人对windows与Linux的共享内存段有一些了解。 在Windows中,似乎只有内存映射文件的等价物,你必须有一个实际的文件漂浮在某个地方。 我的问题是:这实际上是Windows中唯一的一种共享内存,还是它有一个api来创建非基于文件的共享内存段。

  • 共享内存是两个或多个进程共享的内存。 但是,为什么我们需要共享内存或其他通信方式呢? 重申一下,每个进程都有自己的地址空间,如果任何进程想要将自己的地址空间的某些信息与其他进程进行通信,那么只能通过IPC(进程间通信)技术进行。 我们已经知道,通信可以在相关或不相关的进程之间进行。 通常,使用管道或命名管道来执行相互关联的进程通信。 可以使用命名管道或通过共享内存和消息队列的常用IPC技术执行无关

  • 我想在Android系统中将大数据从一个进程/应用程序传输到另一个进程/应用程序,但在Java层使用内存文件创建共享内存的方法并不奏效。 然后尝试在android原生中创建共享内存,我在某处阅读了 ashmem_create_regionAPI可以使用。但看起来这个API无法访问或打开。它在libcutils.so. 这是在 Q1.如何在android本机代码中访问此库。 如果无法访问,那么在nd

  • 通过查看shmget()的手动页面,我了解到shmget()调用在内存中分配了#个页面,这些页面可以在进程之间共享。 它是否要创建内核内存页,并将其映射到进程的本地地址空间?还是为该段保留了相同的进程内存页,并将为其他附加进程共享相同的内存页? 调用shmget()时,内核将保留一定数量的段/页。 调用shmat()时,保留的段映射到进程的地址空间/页。 当一个新进程附加到同一段时,前面创建的内核

  • EasySwoole对Swoole table进行了基础的封装。 方法列表 getInstance() 该方法用于获取TableManager管理器实例 add($name,array $columns,$size = 1024) 该方法用于创建一个table get($name):?Table 该方法用于获取已经创建好的table 示例代码 TableManager::getInstance()

  • shmat是shared memory attach的缩写。而attach本意是贴的意思。 如果进程要使用一段共享内存,那么一定要将该共享内存与当前进程建立联系。即经该共享内存挂接(或称映射)到当前进程。 shmdt则是shmat的反操作,用于将共享内存和当前进程分离。在共享内存使用完毕后都要调用该函数。 函数原型 #include <sys/types.h> #include <sys/shm.