gpt4 book ai didi

c++ - 为什么父/子进程中的对象具有相同的地址?

转载 作者:太空狗 更新时间:2023-10-29 23:49:23 25 4
gpt4 key购买 nike

我对下面的代码有两个问题:

代码:

#include <unistd.h>
#include <semaphore.h>
#include <iostream>

int main(int argc, char **argv)
{
sem_t sem;
int var = 0;

/* create, initialize semaphore */
if( sem_init(&sem,1,1) < 0)
{
perror("semaphore initilization");
exit(0);
}

int pid = fork();
static const size_t loopLen = 5;
if (0 == pid)
{ /* child process */
for (size_t i = 0; i < loopLen; ++i)
{
sem_wait(&sem);
std::string str("Child");
std::cout << str << " process: &var(" << (void*)(&var) << ") var(" << var++ << ") &sem(" << (void*)(&sem) << ")" << std::endl;
sem_post(&sem);
}
}
else
{ /* parent process */
for (size_t i = 0; i < loopLen; ++i)
{
sem_wait(&sem);
std::string str("Parent");
std::cout << str << " process: &var(" << (void*)(&var) << ") var(" << var++ << ") &sem(" << (void*)(&sem) << ")" << std::endl;
sem_post(&sem);
}
}
}

输出:

Parent process: &var(0xffffcbdc) var(0) &sem(0xffffcbe0)
Child process: &var(0xffffcbdc) var(0) &sem(0xffffcbe0)
Parent process: &var(0xffffcbdc) var(1) &sem(0xffffcbe0)
Child process: &var(0xffffcbdc) var(1) &sem(0xffffcbe0)
Parent process: &var(0xffffcbdc) var(2) &sem(0xffffcbe0)
Child process: &var(0xffffcbdc) var(2) &sem(0xffffcbe0)
Parent process: &var(0xffffcbdc) var(3) &sem(0xffffcbe0)
Child process: &var(0xffffcbdc) var(3) &sem(0xffffcbe0)
Parent process: &var(0xffffcbdc) var(4) &sem(0xffffcbe0)
Child process: &var(0xffffcbdc) var(4) &sem(0xffffcbe0)

问题:

为什么varsem从父进程和子进程打印出来的地址一样?我知道子进程获取父进程内存空间内容的拷贝,但我认为进程具有独立且不同的地址空间,因此没有变量会位于同一内存位置 - 但是这个输出似乎另有说明。

问题:

这段代码实际上是在同步两个进程吗?我很怀疑。虽然我用非零的 pshared 标志调用了 sem_init,但似乎子进程应该得到信号量的拷贝。我没有看到 sem 在父进程和子进程之间“共享”的机制:信号量没有命名,我不明白信号量是如何在父进程和子进程之间共享的过程。我怀疑每个进程只是获取和释放它自己的信号量“拷贝”,但我不确定。

谢谢。

最佳答案

Linux 使用“copy-on-write”习惯用法,这意味着在您调用 fork() 之后,父进程的内存不会立即复制(作为单独的拷贝)给子进程。仅当子进程尝试将任何数据写入内存时才会发生复制。

了解“真实”内存地址(即物理内存中的地址)和映射地址(应用程序内存空间中的地址)之间的区别也很重要。两个应用程序中的两个指针可能具有相同的值(虚拟地址),但这并不意味着它们确实指向相同的物理位置:Memory mapping .

关于c++ - 为什么父/子进程中的对象具有相同的地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42131626/

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