2013-12-18 20 views
3

我正在创建一个父母和孩子之间的共享内存。然后,我从孩子&中向共享内存写入一个值,从父级读取它。但是价值观是不同的。下面是代码:为什么从两个不同的进程访问共享内存值时会发生变化?

#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但这样做始终打印结果在这两个进程的地址(又不同。)

+1

您正在将结果写入指针的地址,而不是值。使用'* result = fib;'(注意星号)写入指针的值。同样,在printf中使用'* result'和'%d',而不是'result' /'%p'。 – MischaNix

+0

注意:'int fib = 1; int *结果; result = fib;'_应该生成警告。确保编译器的警告已完全启用,以加快问题识别速度。 – chux

回答

6

的价值是一样的,十进制13等于十六进制为0xD。由于格式代码不同,输出不同:父代使用%d,呈现十进制数,而子代使用%p,以十六进制呈现值。

使用%p不正确,这意味着指针并会给出错误的输出,如果void *不是大小int相同。它适用于这种情况,并且您可以使用%x(或%X)代码可靠地获得十六进制输出。

0

您首先打印它为signed int%d,然后作为指针%pint值为13,当以十六进制形式打印为指针时,13d

3

除了其他答案,结果= 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 
+0

感谢这有助于获得所需的输出。 – ritratt

1

看看结果是整数指针和如何为结果赋值。

它应该是* result = fib

相关问题