福克斯和共享内存

时间:2013-06-14 15:38:56

标签: c pointers process operating-system fork

如果进程及其fork具有不同的数据副本,那么为什么它们的指针是相同的?

在下面的示例中,如果在父进程和子进程之间共享count,我们将看到count: 2。但是,计数不是共享的。但是,为什么&count在父进程和子进程中都返回相同的值?

输出:

count: 1 0x7fff5a617510
count: 1 0x7fff5a617510

程序:

#include <stdio.h>
#include <pthread.h>
#include <sys/types.h>
#include <unistd.h>

int main() {
    pid_t pid;
    int count = 0;

    pid = fork();

    count++;
    printf("count: %d %p \n", count, &count);

    return 0;
}

1 个答案:

答案 0 :(得分:3)

如评论中所述,这是因为虚拟寻址。 AFAIK无法查看物理地址,因为这是由内核和MMU处理的。

另外,请注意,即使在两个进程之间共享count(使用共享内存;例如参见man shmget),也会出现竞争条件。