fork() 之后地址、值和指针会发生什么

2024-01-01

我正在研究一个问题,我要在某个问题之前和之后检查价值观并解决问题fork()在 C 中调用。我的方法是显示变量值和地址,假设在fork()。令我惊讶的是,上述变量的地址保持不变。

我的问题是为什么它们是相同的?如果我更改子项中的变量会发生什么?父母和孩子都会改变吗?如果不是,当父级和子级的地址相同时,我如何才能更改该地址中的值。

代码(供参考):

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>

int main()
{
  int status;
  pid_t pid;

  int a = 123456;
  float b = 123.456;
  char c = 'Z';
  int *e;
  e=&a;

  //Retriving address's
  void *ap=&a, *bp=&b, *cp=&c, *ep=&e;

    printf("Parent Before Fork:\n");
    printf("Integer a: \tvalue = %d, \taddress = %p\n", a, ap);
    printf("Float b: \tvalue = %f, \taddress = %p\n", b, bp);
    printf("Char c: \tvalue = %c, \t\taddress = %p\n", c, cp);
    printf("Pointer e: \tvalue = %p, address = %p\n", e, ep);  

    pid = fork();

    if(pid > 0)
    {
      pid = wait(&status);
      printf("\nParent After Fork:\n");
      printf("Integer a: \tvalue = %d, \taddress = %p\n", a, ap);
      printf("Float b: \tvalue = %f, \taddress = %p\n", b, bp);
      printf("Char c: \tvalue = %c, \t\taddress = %p\n", c, cp);
      printf("Pointer e: \tvalue = %p, address = %p\n", e, ep);

      sleep(1);
    }
    else if(pid == 0)
    {
      printf("\nChild After Fork:\n");
      printf("Integer a: \tvalue = %d, \taddress = %p\n", a, ap);
      printf("Float b: \tvalue = %f, \taddress = %p\n", b, bp);
      printf("Char c: \tvalue = %c, \t\taddress = %p\n", c, cp);
      printf("Pointer e: \tvalue = %p, address = %p\n", e, ep);
   }
   else
     printf("fork() did not work");

return 0; 
}

输出(供参考):

Parent Before Fork:
Integer a:  value = 123456,         address = 0x7fff8b8e378c
Float b:    value = 123.456001,     address = 0x7fff8b8e3790
Char c:     value = Z,              address = 0x7fff8b8e3787
Pointer e:  value = 0x7fff8b8e378c, address = 0x7fff8b8e3798

Child After Fork:
Integer a:  value = 123456,         address = 0x7fff8b8e378c
Float b:    value = 123.456001,     address = 0x7fff8b8e3790
Char c:     value = Z,              address = 0x7fff8b8e3787
Pointer e:  value = 0x7fff8b8e378c, address = 0x7fff8b8e3798

Parent After Fork:
Integer a:  value = 123456,         address = 0x7fff8b8e378c
Float b:    value = 123.456001,     address = 0x7fff8b8e3790
Char c:     value = Z,              address = 0x7fff8b8e3787
Pointer e:  value = 0x7fff8b8e378c, address = 0x7fff8b8e3798

子进程拥有父地址空间的副本。在现代系统中,地址是虚拟化的,因此任何特定的指针地址都可以在一个进程中映射到不同的进程实际地址与在另一个过程中的情况相比。

如果我更改子项中的变量会发生什么?父母和孩子都会改变吗?

子级有自己的变量副本,因此更改子级中的变量不会影响父级中变量的值。

如果不是,当父级和子级的地址相同时,我如何才能更改该地址中的值。

这是由于两个进程中的相同地址映射到不同的物理地址。

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

fork() 之后地址、值和指针会发生什么 的相关文章

  • 为什么我的 C#/pinvoke DeviceIoControl 调用返回 0 字节读取的垃圾数据?

    我有一个运行良好的非托管 C Windows 控制台应用程序 我想要它在 C 中 我已经为必要的 Kernel32 dll 符号完成了 DllImport 语句 StructLayout LayoutKind Sequential inte
  • 简单的C问题

    作为我正在进行的项目的一部分 我必须开始学习 C 我已经开始解决其中的 欧拉 问题 并且遇到了麻烦 我必须找到 1000 以下的所有 3 或 5 的倍数之和 有人可以帮助我吗 谢谢 include
  • 从 Dropbox C# 下载文件[重复]

    这个问题在这里已经有答案了 我正在尝试下载 Dropbox 中的 pdf 文件 我需要将其保存到本地计算机中 可以是任何文件夹C Users User Desktop例如 这是我一直在使用的代码 public void DownloadPd
  • 使绝对定位的div扩展父div高度

    正如你在下面的 CSS 中看到的 我想要child2将自己定位在之前child1 这是因为我目前正在开发的网站也应该在移动设备上运行 在移动设备上child2应该位于底部 因为它包含我想要在移动设备上的内容下方的导航 为什么不是 2 个母版
  • 为什么不能使用initializer_list来初始化unique_ptr的向量? [复制]

    这个问题在这里已经有答案了 我想知道为什么initializer list 不能与unique ptr 一起使用 std vector
  • 有没有办法让我的程序用更少的代码运行?

    我为学校作业编写了以下代码 它编译并打印所有正确的消息 但出于我自己的好奇心 我想知道我的代码是否可以缩短并且仍然有效 我尝试了 signal 而不是 sigaction 但我听说 sigaction 比 signal 更受青睐 此外 此任
  • std::async 参数的生命周期是多少?

    看来函数的参数是通过std async分享未来的生活 include
  • 使用 pthread_cond_signal 优雅地终止线程被证明是有问题的

    我需要发射一堆线程 并希望优雅地将它们拉下来 我正在尝试使用pthread cond signal pthread cond wait实现这一目标 但遇到了问题 这是我的代码 首先是thread main static void thrma
  • 是否返回 std::move (x)?

    Are std vector
  • 为什么我在这段代码中不断得到两个相同的随机值? [复制]

    这个问题在这里已经有答案了 可能的重复 为什么我的随机数生成器在 C 中不是随机的 https stackoverflow com questions 932520 why does it appear that my random num
  • 在 C++ 中初始化指针

    可以在声明时将指针分配给值吗 像这样的东西 int p 1000 是的 您可以在声明时初始化指向值的指针 但是您不能这样做 int p 1000 是个地址运算符 并且您不能将其应用于常量 尽管如果可以 那会很有趣 尝试使用另一个变量 int
  • 本地主机和 request.Url.Authority

    我的应用程序通过 URL 中的公司标识符分隔用户 company1 app com company2 app com 我正在本地 PC 上进行测试 请求如下 company1 localhost com 但是 我的 request Url
  • 如何在Phone类库项目中添加ResourceDictionary并访问它

    我正在开发一个项目 其中我有一个引用图书馆项目的子项目 在我的库项目 电话类库 中 如何创建 ResourceDictionary xaml 其中我需要添加一些样式并在 xaml 文件和 cs 文件中使用它 我需要访问 xaml 文件中的
  • C# 或 Windows 相当于 OS X 的 Core Data?

    我迟到了 现在才开始在 OS X Cocoa 中使用 Core Data 它令人难以置信 并且确实改变了我看待事物的方式 C 或现代 Windows 框架中是否有等效的技术 即拥有可免费保存 数据管理 删除 搜索的托管数据类型 还想知道Li
  • PARITY_NONE 是 C++ Windows 中的关键字吗?

    我正在使用 boost 编写一个串行库 并且我有一个枚举 enum parity t PARITY NONE PARITY ODD PARITY EVEN 我收到如下错误 错误 1 错误 C2059 语法错误 我无法弄清楚问题是什么 然后我
  • 使用 QTestLib 时抑制 qDebug

    我正在向 Qt 中的项目添加单元测试 并希望使用 QTestLib 我已经设置了测试并且它们运行良好 问题是在项目中我们重写了 qDebug 以输出到我们自己的日志文件 这在运行应用程序时效果很好 问题是当我测试类时 它有时会开始记录 然后
  • WPF DataGrid 选定项

    我有一个 DataGrid 用户可以通过在最后一行输入数据来添加项目 我还有一个按钮可以删除当前选定的项目 但是 当选择最后一行 空 用于添加新项目 时 最后选定的项目将保留在 SelectedItem 中 因此 如果我打开窗口 选择最后一
  • 如何在您的网站中连接两个人

    有一款名为 Verbosity 的游戏 这是一款有目的的游戏 位于此链接上www gwap com 在游戏中 他们随机连接两个玩家互相玩 游戏是玩家1应该向他的搭档 玩家2 描述一个单词 而玩家2应该猜测这个单词 我正在尝试建立一个网站来执
  • C# 中的快速字符串解析

    在 C 中解析字符串最快的方法是什么 目前我只是使用字符串索引 string index 并且代码运行合理 但我忍不住认为索引访问器所做的连续范围检查必须添加一些东西 所以 我想知道我应该考虑哪些技术来增强它 这些是我最初的想法 问题 使用
  • 使用 Crypto++ 和 .NET 的 CFB 模式下的 TripleDES

    我正在尝试使用 TripleDES 使用 C 应用程序获得相同的结果 该应用程序具有Crypto https www cryptopp com 和 NET应用程序使用三重DESCryptoServiceProvider https msdn

随机推荐

  • Win7 中的 Python 3.4.0 无法安装 NumPy

    我查看了之前的相关帖子 评论者说 你为什么不使用 Windows 安装程序 所以我按照链接下载了https pypi python org packages 3 4 n numpy numpy 1 8 1 cp34 cp34m macosx
  • 为 Windows Mobile 编译时找不到引用的程序集

    我决定使用tessnet2 http www pixel technology com freeware tessnet2 我的 Windows Mobile 6 项目的库 不幸的是 当我尝试编译它时 它抛出一个错误 tessnet2 Te
  • 如何根据列的变化值对记录进行分组/排名?

    我有下表按 ID 年份 DESC 排序 Id Year Valid 1 2011 1 1 2010 1 1 2009 0 1 2002 1 4 2013 1 4 2012 1 4 2011 1 etc 我想要的是一个额外的排名字段 例如 I
  • 将 google play 服务添加到项目后无法运行项目

    我正在制作一个需要谷歌地图的Android应用程序 我在 Eclipse 中创建了一个新项目并在 Android 手机上编译它 它工作了 但是当我将 google play services lib 导入到我的工作区并在我的项目中添加对它的
  • 如何添加监听多个按钮的动作监听器

    我试图找出我对动作监听器做错了什么 我正在遵循多个教程 但当我尝试使用操作侦听器时 netbeans 和 eclipse 给了我错误 下面是一个简单的程序 我试图让一个按钮在其中工作 我究竟做错了什么 import java awt eve
  • 使用 Jinja 循环项目,每 5 个项目后添加 div

    Problem 我有 100 个高尔夫球场的列表 我希望插入一个 div 其中每五个球场后包含一个广告图像 我该怎么做呢 更新 1 content html 修订后的最新版本 我已经更新了我的原始代码片段 因为 leovp 的 建议在下面编
  • 如何仅倾斜/倾斜 div 的底部

    我一直在尝试在 div 的底部添加倾斜 倾斜 我取得了一些成功 正如您在下面的 JSFiddle 中看到的那样 我成功地应用了倾斜 但这并不完全是我想要的 https jsfiddle net hcow6kjr https jsfiddle
  • OAuthException:(#12) v2.0 及更高版本已弃用事件管理 API

    当我通过离线发布将事件发布到我的墙上时 我陷入了此错误OAuthException 12 events management API is deprecated for versions v2 0 and higher 您无法再使用 Gra
  • Scala 字节的十六进制文字

    包含 A F 数字的十六进制文字默认转换为 int 当我试图用以下方法声明一个 Int 时0x它正在正确创建 val a Int 0x34 val b Int 0xFF 但是当我尝试声明一个字节时0x第二行未编译 val a Byte 0x
  • 为什么浏览器在这里低效地发出 2 个请求?

    我注意到 ajax 和图像加载有些奇怪 假设页面上有一张图像 并且 ajax 请求相同的图像 人们会猜测 ajax 请求会命中浏览器缓存 或者它至少应该只发出一个请求 生成的图像将发送到页面和想要的脚本读取 处理图像 令人惊讶的是 我发现即
  • Hibernate Criteria API - 访问连接属性

    我有一个非常复杂的标准 我用它来检索 排序和分页服务器端数据 我摘录了以下内容 create criteria over a bunch of tables Criteria testCriteria getSession createCr
  • Google 应用引擎禁用请求日志记录

    我正在寻找一种方法来过滤掉请求日志垃圾邮件 以便我可以更轻松地看到警告或错误 这似乎在本地有效 loggers django handlers console level WARNING 但GAE失败 根据这个问题 https stacko
  • 错误:将“char*”分配给“char [20]”时类型不兼容

    我是这个 C 环境的新手 并且我的构造函数遇到了困难 这是我的代码 class Student char name 20 long number public Student char nm 20 long val name nm numb
  • 无法在 Airflow UI 中编辑 Spark_default

    我正在尝试使用以下存储库运行 Airflow 和 Spark 的容器化应用程序 https github com cordon thiago airflow spark https github com cordon thiago airf
  • sys.exit 对于多线程到底有什么作用?

    我对 python 中的 sys exit 感到非常困惑 在python 文档 https docs python org 2 library sys html 它说 退出Python 这是否意味着当sys exit 在python程序中调
  • 什么是浏览器二进制管理器如何将其用于 Selenium

    我最近知道使用 WebDriver Binaries 管理器是自动化项目中的一个很好的实践 但不确定这是什么以及如何使用 也做了一些谷歌搜索 并得到了很多关于如何管理二进制文件的帖子 但没有说明为什么使用 因此 如果有人能够指导它及其好处
  • 将一个文件的内容以换行符分隔附加到另一个文件

    我想 我正在尝试复制cat以与平台无关的方式使用 Linux shell 的功能 这样我就可以获取两个文本文件并按以下方式合并它们的内容 file 1 包含 42 bottles of beer on the wall file 2 包含
  • 使用RavenDB作为持久缓存

    我目前有一个 Web 应用程序 它在内存中缓存大量数据 数十万个条目 以供快速查找 然后在 SQL Server 中作为持久缓存 基本上 该信息由地址的地理编码组成 其中地理编码是通过远程 Web 服务检索的 如果需要连续调用而不是缓存 则
  • 如何使用libpcap中的“pcap_lookupdev()”?

    代码找不到任何设备 我想知道 pcap lookupdev 是做什么的 谢谢 include
  • fork() 之后地址、值和指针会发生什么

    我正在研究一个问题 我要在某个问题之前和之后检查价值观并解决问题fork 在 C 中调用 我的方法是显示变量值和地址 假设在fork 令我惊讶的是 上述变量的地址保持不变 我的问题是为什么它们是相同的 如果我更改子项中的变量会发生什么 父母