c - 在子进程和父进程中,变量具有相同的地址但具有不同的值?

标签 c linux unix pipe fork

#include <stdio.h>
#include <unistd.h>

int main() {
    int x = 0;
    pid_t pid = fork();
    if(pid == 0) {
        //adding one to X when it is child process
        x++;
    }
    printf("current X: %d, address of X: %p, process : %d\n", x, &x, pid);
}

结果是: result

所以我对 Unix 很陌生,对 fork() 不太熟悉。如果子进程将复制父进程,以便它具有不同的地址空间。那么,为什么这里两个进程上的X具有相同的地址但不同的值呢?

最佳答案

这就是 fork 的工作原理。它创建地址空间的副本,实际上它进行了一些优化(仅需要写入更改的页面)。

副本使用相同的地址:

  • 这是可能的,因为父进程和子进程只能看到自己的版本

  • 这是必需的:如果您有任何链接的数据结构,从一个对象到另一个对象的指针必须保持有效。如果复制的地址空间将占用不同的地址,则所有指针都必须固定 - 并且操作系统甚至不知道哪些字节是指针,哪些只是数据。

关于c - 在子进程和父进程中,变量具有相同的地址但具有不同的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52436180/

相关文章:

linux - git 可以用来处理 repo 中的项目吗?

c - 在 Linux 终端中打开用户指定的文件名

c - ftp 客户端从服务器读取不完整的消息

c - 验证在双指针函数参数中正确使用 const

c - 递归 C void 函数和 return 关键字

linux - Bash 脚本在目录中保留 'x' 个字符?

c - sprintf vs strcpy - 使用更多内存和快速复制还是几乎没有内存和慢速复制?

linux - Perl:循环运行另一个系统命令时在后台尾部文件

bash - 我想做一个有条件的 cronjob

unix - FreeBSD 上的 "tty"是什么?