我有两个通过共享内存进行通信的进程(客户端和服务器)。
我需要创建一个动态的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];
}
}
服务器代码:
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]);
}
我收到“分段错误”错误。
感谢。
答案 0 :(得分:5)
即使您的shared_stuff
对象位于共享内存中,也不会将数组写入共享内存。您正在使用malloc
分配空间,将数据写入该空间,然后将指向该空间的指针放入shared_stuff
。 malloc
在当前进程的正常地址空间内分配空间,而不是在您创建的共享内存段中。您需要将数组内容写入共享内存。
假设共享内存段中的阵列有足够的空间,您必须自己管理地址,而不是使用malloc
。 (如果没有足够的空间,则必须使共享内存段更大,或者随着时间的推移将信息分段传送。)
您可以在共享内存段中放置一个可变长度数组,如下所示。
首先,定义一个包含所需“管理”信息的结构,例如数组大小:
struct StuffStruct
{
size_t NumberOfRows, NumberOfColumns;
… Other information as desired.
};
创建指向该结构的指针并将其设置为指向共享内存段:
struct StuffStruct *Stuff = shm; // shm contains the address from shmat, performed previously.
创建一个指向具有所需列数的数组的指针,并将其设置为指向初始结构后的共享内存段:
int (*data_store)[NumberOfColumns] = (int (*)[NumberOfColumns]) ((char *) Stuff + sizeof *Stuff);
(关于C纯粹主义者的注意事项:是的,C标准并不保证当您像这样执行指针算法时会发生什么。但是,任何提供共享内存支持的实现都必须支持这种指针算法。)
请注意,sizeof *Stuff + NumberOfRows * NumberOfColumns * size(int)
必须不大于共享内存段的大小。否则,您将在下一步中超出共享内存段。
对于下一步,请使用数据填充数组:将值分配给data_store
的元素,与普通的二维数组一样。
在服务器中,以相同的方式设置Stuff
。然后,在客户端编写共享内存段后,从Stuff
读取行数和列数。然后以相同的方式设置data_store
。然后阅读data_store
。