7

我有 2 个进程(客户端和服务器)通过共享内存进行通信。

我需要创建一个动态的二维数组(基于参数)。数组存储在结构中,然后写入共享段。

我可以将数组写入共享内存,但无法从其他进程中检索它。

客户代码:

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]);              
}

我收到“分段错误”错误。

谢谢。

4

1 回答 1

6

即使您的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.

于 2013-02-26T21:44:06.180 回答