Jak*_*ans 6 c memory shared multidimensional-array
我有两个通过共享内存进行通信的进程(客户端和服务器).
我需要创建一个动态的2D数组(基于参数).数组存储在结构中,然后写入共享段.
我可以将数组写入共享内存,但无法从其他进程中检索它.
客户代码:
struct shared_use_st {
int written_by_you;
int **PID_PRI_array;
};
/* Prepare Dynamic 2D array */
data_store = malloc(/*ROWS*/ 5 * sizeof(int*));
for(i=0;i<5; i++)
data_store[i] = malloc(/*COLS*/ 2 * sizeof(int));
/* Prepare Dynamic 2D array - Shared Memory Seg */
shared_stuff->PID_PRI_array = malloc(/*ROWS*/ 5 * sizeof(int*));
for(i=0;i<5; i++)
shared_stuff->PID_PRI_array[i] = malloc(/*COLS*/ 2 * sizeof(int));
/* Write PID and PRI to data_store array */
data_store[0][0] = pid;
data_store[0][1] = 1;
data_store[1][0] = 12345;
data_store[1][1] = 2;
data_store[2][0] = 12346;
data_store[2][1] = 3;
data_store[3][0] = 12347;
data_store[3][1] = 4;
data_store[4][0] = 12348;
data_store[4][1] = 5;
for(i=0;i<5;i++){
for(x=0;x<=1;x++){
shared_stuff->PID_PRI_array[i][x] = data_store[i][x];
}
}
Run Code Online (Sandbox Code Playgroud)
服务器代码:
for(i=0;i<5;i++){
printf("PID: %d, PRI:%d\n", shared_stuff->PID_PRI_array[i][0], shared_stuff->PID_PRI_array[i][1]);
}
Run Code Online (Sandbox Code Playgroud)
我收到"分段错误"错误.
谢谢.
即使您的shared_stuff对象位于共享内存中,也不会将该数组写入共享内存.您正在分配空间malloc,将数据写入该空间,然后将指针放入该空间shared_stuff.malloc在当前进程的正常地址空间内分配空间,而不是在您创建的共享内存段中.您需要将数组内容写入共享内存.
假设共享内存段中的阵列有足够的空间,您必须自己管理地址,而不是使用malloc.(如果没有足够的空间,则必须使共享内存段更大,或者随着时间的推移将信息分段传送.)
您可以将可变长度数组放在共享内存段中,如下所示.
首先,定义一个包含所需"管理"信息的结构,例如数组大小:
struct StuffStruct
{
size_t NumberOfRows, NumberOfColumns;
… Other information as desired.
};
Run Code Online (Sandbox Code Playgroud)
创建指向该结构的指针并将其设置为指向共享内存段:
struct StuffStruct *Stuff = shm; // shm contains the address from shmat, performed previously.
Run Code Online (Sandbox Code Playgroud)
创建一个指向具有所需列数的数组的指针,并将其设置为指向初始结构后的共享内存段:
int (*data_store)[NumberOfColumns] = (int (*)[NumberOfColumns]) ((char *) Stuff + sizeof *Stuff);
Run Code Online (Sandbox Code Playgroud)
(对于C纯粹主义者的注意事项:是的,C标准并不保证当您像这样执行指针算法时会发生什么.但是,任何提供共享内存支持的实现都必须支持这种指针算法.)
请注意,sizeof *Stuff + NumberOfRows * NumberOfColumns * size(int) 必须不大于共享内存段的大小.否则,您将在下一步中超出共享内存段.
对于下一步,使用数据填充数组:将值分配给data_store正常二维数组的元素.
在服务器中,设置Stuff相同的方式.然后,在客户端编写共享内存段后,从中读取行数和列数Stuff.然后设置data_store相同的方式.然后阅读data_store.