我还没有理解fork()生成的进程。 如果我尝试这样的代码:
int main(int argc, char** argv)
{
void* mem=malloc(100);
pid_t pid=fork();
printf("%p\n",mem);
}
两个进程都打印相同的地址。 那么它们是否指向堆中的相同内存区域? 这不危险吗?可能存在冲突。 我的书说复制了堆栈上的值,但它没有谈论堆。
答案 0 :(得分:5)
不同的进程包含在单独的虚拟地址空间中,因此这些内存地址指向不同的内存位置。
正如Karoly Horvath所说,由于名为copy-on-write的优化,它有点复杂,它基本上允许只有一个副本,直到需要区分。这是通过页面错误实现的,最后两个单独的虚拟地址空间中的相同地址不会引用相同的内存位置。
答案 1 :(得分:0)
环境,资源限制,umask,控制终端,当前工作目录,根目录,信号掩码和其他进程资源与分叉子进程中的父进程重复。