基本上 - 我想放置一个单数
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*/}
(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`
我将使用灵活的数组成员,并使用
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 */
}
}
}