gpt4 book ai didi

C shmat 函数

转载 作者:行者123 更新时间:2023-11-30 15:25:59 26 4
gpt4 key购买 nike

我想创建一个在 C 中创建并附加共享内存的函数。当我在 main 中执行此操作时,它工作正常,但是当我将相同的代码放入函数中时 shmat返回NULL .

int main() { 

int data=0;
int* shm_data=NULL;
int shmid;

if ( ( shmid = shmget( SMKEY_data, sizeof(int), IPC_CREAT | 0666 ) ) < 0) {
perror("Shmget Faild (shmid) ");
exit(3);
}

if ( (shm_data = shmat(shmid, 0, 0)) == (int *) - 1) {
perror("Shmat Faild (shm_data) ");
exit(4);
}
*shm_data = data;

printf("1: %d\n", *shm_data);

if ( fork() == 0 ) {
(*shm_data)++;
}
else {
int s;
wait(&s);
printf("2: %d\n", *shm_data);
}
return 0;
}

输出:

1:0
2:1
<小时/>
void doshm(int* shmid, int* shm_data, int* data) { 
if ( ( (*shmid) = shmget( SMKEY_data, sizeof(int), IPC_CREAT | 0666 ) ) < 0) {
perror("Shmget Faild (shmid) ");
exit(3);
}

if ( (shm_data = shmat( (*shmid), 0, 0)) == (int *) - 1) {
perror("Shmat Faild (shm_data) ");
exit(4);
}
*shm_data = *data;
}

int main() {
int data=0;
int* shm_data=NULL;
int shmid;

doshm(&shmid, shm_data, &data);

printf("1: %d\n", *shm_data);

if ( fork() == 0 ) {
(*shm_data)++;
}
else {
int s;
wait(&s);
printf("2: %d\n", *shm_data);
}
return 0;
}

输出:

Segmentation fault (core dumped)

最佳答案

shm_data 初始化为 NULL 并且不会重新分配,像这样通过引用将其传递给 doshm

doshm(&shmid, &shm_data, &data);

然后将doshm的签名更改为

doshm(int* shmid, int** shm_data, int* data)

最后,从 doshm 中删除这一行

*shm_data = *data

另外,在 doshm 之后、printf 之前检查 shm_data == NULL

关于C shmat 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27555584/

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