带有结构体数组和另一个不相关变量的shmat指针

问题描述 投票:0回答:1

基本上 - 我想放置一个单数

int
和以下结构的数组:

struct My_structure {
    char my_text[200];
    char my_name[20];
    int my_number;
};

进入通过

shmat
获得的共享内存段(IPC System V)。但是,我不太知道如何实现这一目标。

首先,是否有可能将不相关的

int
和数组放在一个段中,或者我必须将它们分开?这种分离将如何进行?
shmget
shmat
再一次就为了这个
int

第二 - 如何实际使用 shmat 编写它以便我可以处理错误?我见过一些人们将 shmat 与 char (但没有错误处理)和 int (有错误处理)一起使用的示例,但结构显然不能处于负面状态(下面的链接是我看到的)。 https://www.csl.mtu.edu/cs4411.ck/www/NOTES/process/shm/shmat.html https://www.geeksforgeeks.org/ipc-shared-memory/ 在代码的当前状态下,我在尝试比较指针和整数时收到警告:

warning: comparison between pointer and integer
   55 |         if ((shm_pointer = (struct My_structure *) shmat(shm_id, NULL, 0)) == -1){
      | 

第三-如何将共享内存的“内部”变成一个数组?或者实际上任何功能与数组足够相似的东西,我需要能够以某种形状或形式做到

array[number]

下面是与问题相关的代码片段:


//those two lines before the problematic one seem to work right
//im pretty sure i wouldnt declare the array beforehand in the final version, its just more practical at this stage of writing the code
if ((key = ftok(argv[1],2137)) == -1){/*error handling*/}
if ((shm_id = shmget(key, sizeof(array_of_structs) + sizeof(unrelated_singular_int), 0644 | IPC_CREAT)) == -1){/*error handling*/}

//cant quite wrap my head around it
if ((shm_pointer = (struct My_structure *) shmat(shm_id, NULL, 0)) == -1){/*error handling*/}
c ipc
1个回答
0
投票
  1. (shm_pointer = (struct My_structure *) shmat(shm_id, NULL, 0)) is a pointer of type 
    无效*
    . You compare it with integer 
    -1
    . You should compare with 
    (无效*)-1`

  2. 我将使用灵活的数组成员,并使用

    int
    和所需的数组创建一个附加结构(示例中的 99 只是一个示例):

struct My_structure {
    char my_text[200];
    char my_name[20];
    int my_number;
};

typedef struct
{
    int some_int;
    struct My_structure mystructarray[];
}My_data;


int getSHM_ID(size_t array_size)
{
    return  shmget(IPC_PRIVATE, sizeof(My_data) + array_size * sizeof((My_data){0}.mystructarray[0]), IPC_CREAT | 0666);
}

void foo()
{
    int shm_id = getSHM_ID(99);
    if(shm_id != -1)
    {
        My_data *data;
        if((data = shmat(shm_id, NULL, 0)) != (void *)-1)
        {
            /* do something */
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.