从两个不同的进程访问时,为什么共享内存值会发生变化?

时间:2013-12-18 18:52:00

标签: c pointers shared-memory

我在父母和孩子之间创建共享内存。然后我从子和共享内存中写入一个值。从父母那里读。但价值观是不同的。这是代码:

#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但这样做总是在两个进程中打印结果的地址(再次不同。)

4 个答案:

答案 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,当以十六进制打印为指针时,13d