我想创建一个在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)
答案 0 :(得分:1)
shm_data
已初始化为NULL
,且从未重新分配,通过引用传递给doshm
doshm(&shmid, &shm_data, &data);
然后将doshm
的签名更改为
doshm(int* shmid, int** shm_data, int* data)
最后,从doshm
*shm_data = *data
另外,在shm_data == NULL
之后doshm
之后检查printf
。
答案 1 :(得分:0)
当你写
doshm(&shmid, shm_data, &data);
然后在shm_data
doshm
的值
if ( (shm_data = shmat(shmid, 0, 0)) == (int *) - 1) { ... }
然后此更改将对变量的本地副本进行操作,并且此更改不会应用于main
范围内的版本,其中shm_data
仍为NULL
}。