我在父母和孩子之间创建共享内存。然后我从子和共享内存中写入一个值。从父母那里读。但价值观是不同的。这是代码:
#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;
}
这是输出:
输入尺寸
5
纤维值13
孩子的结果是0xd
孩子完成了 0xb778f000
如您所见,从儿童和父母打印时,打印结果的值不同。为什么会这样?
我也尝试过:
result = &fib
但这样做总是在两个进程中打印结果的地址(再次不同。)
答案 0 :(得分:6)
值相同,十进制13等于十六进制0xD。输出是不同的,因为格式代码不同:父级使用%d
,以十进制呈现数字,而子级使用%p
,以十六进制呈现值。
使用%p
不正确,它意味着指针,如果void *
与int
的大小不同,则输出错误。它适用于这种情况,您可以使用%x
(或%X
)代码可靠地获取十六进制输出。
答案 1 :(得分:3)
除了其他答案之外,result = fib表示将int指针的地址设置为fib的值。如果您尝试将fib的值存储在结果中,则需要*result = fib
。如果您运行代码,您将看到父代和子代的地址相同。
因此,如果您想在父级和子级中查看计算的值,请更改为
*result = fib;
printf("result in child is %d\n", *result);
printf("result in parent is %d\n", *result);
产量
Enter size
5
fib value 13
result in child is 13
child done
result in parent is 13
答案 2 :(得分:1)
查看结果是整数指针以及如何为结果赋值。
它应该是* result = fib
答案 3 :(得分:0)
您首先将其打印为signed int
%d
,然后将其作为指针%p
打印。 int
值为13
,当以十六进制打印为指针时,13
为d
。