gpt4 book ai didi

c - 在 QNX 中使用 fork() 时如何确保子进程和父进程具有不同的地址空间

转载 作者:太空宇宙 更新时间:2023-11-04 00:57:44 27 4
gpt4 key购买 nike

这个问题是关于 QNX 的,并且在标题中有很多说明。我尝试在两个进程中修改变量地址后记录它们,假设写时复制不再工作并且它们不相同,所以我希望地址不同。但它们是相同的(虚拟地址,但仍然如此)。

那么如何在不打印变量值的情况下检查一个进程不会影响另一个进程,也许有更简单的解决方案?

int q;
q = 3;
...
if (pid == 0) {
// in child
q = 5;
printf("%d\n", &q);
} else {
// in parent
q = 9;
printf("%d\n", &q);
}

最佳答案

您打印的虚拟地址将是相同的——子进程几乎是其父进程的副本。一旦一个进程试图修改该页面中的数据,程序访问的物理地址将是分开的,但这将对两个进程完全隐藏。这就是虚拟内存的美妙之处。

请注意,您使用的打印地址格式有误;你应该使用 %p并将地址转换为 void * :

printf("%p\n", (void *)&q);

或使用 <inttypes.h>uintptr_tPRIXPTR (或者 PRIdPTR 你真的想要十进制地址而不是十六进制地址):

printf("0x%" PRIXPTR "\n", (uintptr_t)&q);

也打印数字 - 并在循环中多次打印,其中包含某种 sleep 。您会看到尽管逻辑(虚拟)地址相同,但物理地址不同。不过,您将无法轻松找到实际地址。

关于c - 在 QNX 中使用 fork() 时如何确保子进程和父进程具有不同的地址空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53008400/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com