gpt4 book ai didi

operating-system - 子进程(由 fork() 创建)访问父进程的堆部分是否合法?

转载 作者:行者123 更新时间:2023-12-04 08:30:43 24 4
gpt4 key购买 nike

子进程可以访问(读写)父进程的堆地址空间吗?
以下是我在 http://www.ideone.com/R5vDT 尝试的程序运行成功:

int main(){
int *p = (int*)malloc(sizeof(int));
if(fork()){
//parent process
*p = 25;//Write
printf("Parent %d: %d %p\n", getpid(), *p, p);//Read
}else{
//child process
*p = 15;//write
printf("Child %d: %d %p\n", getpid(), *p, p);//read
}
return 0;
}

输出是:
Parent 30597: 25 0x9781008
Child 30600: 15 0x9781008

我已经阅读过 C-O-W(写入时复制),但 p 指向的地址即使在写入操作之后也是相同的。操作系统不应该因为一个进程正在访问其地址空间之外的内存而引发异常吗?

最佳答案

好吧,这两个进程有自己的地址空间,每个进程看起来都一样,即使它们没有访问相同的内存。然而,许多操作系统实现了一种称为写时复制的东西,这意味着在您调用 fork 时不会复制内存,而是在某个进程修改内存时复制内存。只要没有进程写入内存,它们就会从同一个内存中读取。当其中一个尝试修改内存时,会引发某种类型的异常并复制内存,以便它们都有一个私有(private)内存区域,任何其他进程都无法访问。

关于operating-system - 子进程(由 fork() 创建)访问父进程的堆部分是否合法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7880845/

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