我正在创建一个父母和孩子之间的共享内存。然后,我从孩子&中向共享内存写入一个值,从父级读取它。但是价值观是不同的。下面是代码:为什么从两个不同的进程访问共享内存值时会发生变化?
#include <sys/shm.h>
#include <sys/stat.h>
#include <stdio.h>
int main()
{
int seg_id, pid;
int fib1 = 1, fib = 1, temp;
int i, tempsize;
int *result;
seg_id = shmget(IPC_PRIVATE, 8, S_IRUSR | S_IWUSR);
result = (int *) shmat(seg_id, NULL, 0);
printf("Enter size\n> ");
scanf("%d", &tempsize);
pid = fork();
if (pid == 0)
{
for(i = 0; i < tempsize; i++)
{
temp = fib;
fib = fib + fib1;
fib1 = temp;
}
printf("fib value %d\n", fib);
result = fib;
printf("result in child is %p\n", result);
printf("child done\n");
}
else if(pid > 0)
{
wait(0);
printf("%p\n", result);
}
return 1;
}
这里是输出:
输入尺寸
FIB值13
结果孩子0xd中
孩子做
0xb778f000
正如你所能请参阅从孩子和父母打印时打印结果的值不同。这是为什么发生?
我也想这样做: result = &fib
但这样做始终打印结果在这两个进程的地址(又不同。)
您正在将结果写入指针的地址,而不是值。使用'* result = fib;'(注意星号)写入指针的值。同样,在printf中使用'* result'和'%d',而不是'result' /'%p'。 – MischaNix
注意:'int fib = 1; int *结果; result = fib;'_应该生成警告。确保编译器的警告已完全启用,以加快问题识别速度。 – chux