当有全局指针时,为什么分叉的进程不会互相影响?

2024-01-15

我知道fork()函数创建一个与其父进程相同的进程,仅其具有的 PID 不同。它们最初具有相同的变量,并且对这些变量所做的更改不会相互影响。但是当全局指针变量被共享时会发生什么呢?

我写了一些代码并打印出了结果。看起来父进程和子进程都有指向same内存位置,但是对这些内存位置进行的更改,即*p = 1在父母和*p = 2孩子之间,互不影响。另请注意,我创建了父进程wait(NULL)直到子进程退出。因此,子进程更改了与父进程指针具有相同内存地址的指针所指向的值。

我知道什么时候fork()被调用时,父进程克隆所有内容:寄存器、程序计数器等。但这怎么可能呢?子进程退出后,父进程的变量值不应该改变吗?是否是因为系统将所有内容(包括父进程的指针变量)放入堆栈并在子进程终止时弹出它们?


当一个进程被分叉时,新进程是为了所有(?)意图和目的copy原创的,有自己的虚拟地址空间 http://en.wikipedia.org/wiki/Virtual_memory、文件描述符等从相当简单的角度来看,相同的内存地址实际上会指向每个进程的不同物理内存地址 - 您可以有两个指向完全不同数据的相等指针。

当然,在现代操作系统中事情并不那么简单。fork(),例如,实际上并不copy一切都会浪费处理器时间和内存。内核使用了一些页表 http://en.wikipedia.org/wiki/Page_table操纵来实施写时复制 http://en.wikipedia.org/wiki/Copy-on-write内存复制。此外,出于性能和正确性的原因,可以在某种程度上控制哪些资源将实际克隆到子进程。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当有全局指针时,为什么分叉的进程不会互相影响? 的相关文章

随机推荐

  • 使用公司范围的超级/父 POM 覆盖超级 POM

    我们希望有一个全公司超级POM它将继承自通常的超级 POM 我们公司的所有项目都会从中继承隐式继承 这可能吗 截至目前我们必须显式继承来自我们公司范围内的超级 POM 这不是很方便 而且容易出错 有人可以建议吗 据我所知 这方面没有最佳实践
  • 使用 AJAX 时检查会话超时

    我有一个 ColdFusion 页面 用户可以打开模式并查看有关一行数据的更多信息 但是 如果用户在页面上停留的时间超过默认的 20 分钟会话超时 则会抛出错误 因为它正在查找会话变量但找不到它们 我了解如何使用服务器端代码来捕获此问题 但
  • 如何获得具有交替距离的xticks?

    我有一个条形图 其中 x 轴有国家 地区的 2 个字母标签 我必须选择一个非常小的字体 这样 x 刻度就不会相互重叠 有什么方法可以指定 x 刻度和 x 轴之间的距离 以便我可以选择更大的字体而不会重叠标签 现在 所需的示例 axis ti
  • 使用 geopandas 缓冲错误点

    晚上好 我正在开发一种产品来检测订阅区域内的本地事件 罢工 黄色多边形应该是围绕中心红点 40KM 左 和 50KM 右 的圆圈 绿点是我的罢工 应该在我的过程中检测到 看来我当前使用的 buffer 没有产生预期的 40 50 Km 缓冲
  • 为什么我的保证金不能与位置一起使用:固定?

    JSFiddle 演示 https jsfiddle net 0cmvg92m 我有一个用于标题的 div 和一个用于内容换行的 div 由于某种原因 我无法在标题底部留出边距来强制内容换行向下推 它只是完全忽略它 我不知道为什么 有谁知道
  • PHP IIS7 MSSQL 调用未定义的函数 sqlsrv_connect

    我有 MSSQL Server 2008 MS WINDOWS SERVER 2008 RC2 和 PHP 5 4 php info 有行 PHP PDO SQLSRV 54 NTS extension php pdo sqlsrv 54
  • 来自 gitlab-ci docker 的 SSH 在“SSH2_MSG_KEX_ECDH_REPLY”上失败

    我正在尝试从 GitLab CI 中运行的 Docker 部署容器通过 SSH 连接到远程网络服务器 我第一次尝试时确实成功连接了一次 现在它不断失败 调试输出的最后两行 完整输出如下 是 debug1 expecting SSH2 MSG
  • 如何关闭yarn@2 PnP?

    我正在使用纱线2 0 0 rc 27 工作区 TypeScript 我想关闭 PnP 并使用node modules再次 我尝试了以下设置package json installConfig pnp false 然而 Yarn 每次都使用
  • 主干视图扩展被污染

    我有一个代表模式的视图 该视图有一些属性 例如页脚额外类 我遇到一个问题 当某些模式改变它的值时 所有模式都会收到相同的属性 这是例子 var ModalView AlertingView extend className modal pa
  • iPhone 和 Core Data:如何在更新之间保留用户输入的数据?

    考虑一个包含动物目录的 iPhone 应用程序 该应用程序应允许用户为每只动物添加自定义信息 比如说评级 范围为 1 到 5 以及他们可以输入的有关该动物的一些注释 但是 用户将无法修改动物数据本身 假设当应用程序更新时 静态 目录部分应该
  • 如何使用 JScript 获取进程的主窗口句柄?

    JScript 中是否有任何方法可以通过提供进程名称来获取进程主窗口的句柄 这Process MainWindowHandle http msdn microsoft com en us library system diagnostics
  • 从开发迁移到云时从一个连接字符串切换到另一个连接字符串

    我正在开发一个云应用程序 当我在计算机上测试应用程序时 我希望在 Service Configuration cscfg 中按如下方式设置连接字符串
  • Jquery 窗口最小化切换

    我有一个 div 当您单击另一个 div 时 它会切换显示和不显示 我如何修改我的代码 以便当用户最小化整个浏览器窗口时它会自动切换 从视图中隐藏 div 以便当用户取消最小化窗口时 div 不再可见 最小化窗口 或切换到另一个应用程序 应
  • 将 REST 调用与“Activity”分离的最佳方法

    我正在使用 Retrofit 并希望当用户在我的活动之间导航时 REST 调用能够继续存在 而不是仅在配置更改时保留它们 几个选项 改进同步调用AsyncTask并将其放入保留的 任务片段 http www androiddesignpat
  • 如何通过adb获取android手机的电话号码?

    有没有办法通过adb获取手机的电话号码 我认为 dumpsys 是一个可能的答案 但系统服务似乎都没有跟踪手机自己的号码 iphonesubinfo服务 跟踪 订户信息 包括电话号码 很遗憾iphonesubinfo服务没有实现dump 方
  • 我们如何创建非对称安全密钥?

    我们如何在 C 中创建 AsymmetrySecurityKey 实际上 我们正在使用 AsymetricSecurityKey 创建签名凭据 这是我们的代码 Define const Key this should be private
  • 如何在jquery中单击按钮时获取所选下拉值的值

    我使用 Bootstrap 和 jquery 创建一个包含下拉菜单和按钮的动态表 我想在单击按钮时获取在 jquery 中选择的下拉菜单的值 下面是我的代码 table class table table bordered tbody fo
  • 计算图形的方向以将其拉直(在Python中)

    我有一个计算图形方向的代码和一个根据计算出的方向拉直图形的函数 当我运行代码时 方向似乎很好 但是当函数尝试拉直图形时 图形看起来像是变成了另一种形状 代码中可能有什么问题吗 代码 import numpy as np import mat
  • 获取或设置UIButtonTypeInfoLight的点击区域

    因此 类型为 UIButtonTypeInfoLight 的 UIButton 的可点击区域似乎比其框架大得多 因此 我无法在它旁边放置按钮 尝试点击它会点击信息按钮 infoButton frame CGRectMake 0 0 40 h
  • 当有全局指针时,为什么分叉的进程不会互相影响?

    我知道fork 函数创建一个与其父进程相同的进程 仅其具有的 PID 不同 它们最初具有相同的变量 并且对这些变量所做的更改不会相互影响 但是当全局指针变量被共享时会发生什么呢 我写了一些代码并打印出了结果 看起来父进程和子进程都有指向sa