我没有理解一些关于与叉生成过程()。 如果我试着像这样的代码:两个进程共享相同的堆
int main(int argc, char** argv)
{
void* mem=malloc(100);
pid_t pid=fork();
printf("%p\n",mem);
}
这两个过程都打印相同的地址。 那么他们是否指向堆中相同的内存区域? 这不危险吗?可能有冲突。 我的书说,在栈上的值复制,但它并没有谈论堆。所以那些存储器地址指向不同的存储位置
我没有理解一些关于与叉生成过程()。 如果我试着像这样的代码:两个进程共享相同的堆
int main(int argc, char** argv)
{
void* mem=malloc(100);
pid_t pid=fork();
printf("%p\n",mem);
}
这两个过程都打印相同的地址。 那么他们是否指向堆中相同的内存区域? 这不危险吗?可能有冲突。 我的书说,在栈上的值复制,但它并没有谈论堆。所以那些存储器地址指向不同的存储位置
不同的进程包含在不同的虚拟地址空间。
正如Karoly Horvath所说,由于copy-on-write的优化,它会更复杂一点,它基本上允许拥有一个副本直到需要区分为止。这是通过页面错误实现的,最后两个单独的虚拟地址空间中的相同地址不涉及相同的存储位置。
没有,他们指向同一个硬件地址,直到你把它写。当您执行fork()时,操作系统会将内存中的所有页面标记为在写入时创建页面错误。该写入被捕获,并且只有实际的复制发生。只要你只是从这个工作得很好,节省了宝贵的内存和CPU时间内存读取;) – 2012-03-08 13:39:43
你应该是一个答案 – Useless 2012-03-08 13:53:08
环境,资源限制的umask,控制终端,当前工作目录,根目录下,信号口罩等处理资源从在叉形子进程父复制。
https://en.wikipedia.org/wiki/Virtual_memory – 2012-03-08 14:19:06