gpt4 book ai didi

c - 如何访问共享内存中的变量

转载 作者:行者123 更新时间:2023-12-04 05:30:05 24 4
gpt4 key购买 nike

我正在尝试创建一个包含三个整数和一个数组的共享内存段。该段已创建并附加了一个指针,但是当我尝试访问变量的值(无论是更改、打印等)时,我遇到了段错误。

这是我试过的代码:

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/shm.h>

#define SIZE 10

int* shm_front;
int* shm_end;
int* shm_count;
int* shm_array;
int shm_size = 3*sizeof(int) + sizeof(int[SIZE]);

int main(int argc, char* argsv[])
{
int shmid;

//create shared memory segment
if((shmid = shmget(IPC_PRIVATE, shm_size, 0644)) == -1)
{
printf("error in shmget");
exit(1);
}

//obtain the pointer to the segment
if((shm_front = (int*)shmat(shmid, (void *)0, 0)) == (void *)-1)
{
printf("error in shmat");
exit(1);
}
//move down the segment to set the other pointers
shm_end = shm_front + 1;
shm_count = shm_front + 2;
shm_array = shm_front + 3;

//tests on shm
*shm_end = 10; //gives segmentation fault
printf("\n%d", *shm_end); //gives segmentation fault

//clean-up
//get rid of shared memory
shmdt(shm_front);
shmctl(shmid, IPC_RMID, NULL);

printf("\n\n");
return 0;
}

我尝试通过取消引用结构体的指针来访问共享内存,但每次都出现段错误。

谢谢大家,现在没有段错误。

最佳答案

在您的代码中,您没有包含 sys/shm.h ,这应该会导致你的编译器吐出这些:

warning: implicit declaration of function ‘shmget’
warning: implicit declaration of function ‘shmat’
warning: implicit declaration of function ‘shmdt’
warning: implicit declaration of function ‘shmctl’

类型转换 shmat 的返回值到 int *还将隐藏此警告:
warning: assignment makes pointer from integer without a cast

这里可能发生的事情是,因为 shmat未定义,编译器将隐式返回 int而不是 void * .如果它返回的地址不适合有符号整数,则会出现整数溢出,这是未定义的行为,并且很可能会导致访问未分配内存位置的段错误。

您不应该强制转换返回 void * 的函数的返回值专门用于捕获这些错误(并且始终在启用警告的情况下进行编译)。

关于c - 如何访问共享内存中的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12749176/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com