c - fork() 和地址空间
问题描述
如果调用执行子代码的函数会发生什么?父进程的地址空间被复制,但不能使用父进程的局部变量。我知道在使用 fork() 时,地址空间仅在子进程或父进程中进行写入时才会被复制,因此如果在父进程中进行了写入,那么子进程将获得父地址空间的副本。可以将子代码放在单独的函数中吗?
void child(){
//do something
}
int main(int argc, char const *argv[])
{
int x = 0;
int pid;
if((pid=fork()) < 0){
printf("error\n");
exit(1);
}
if(pid==0){
child();
}
x=12;
return 0;
}
解决方案
孩子获得了父母地址空间的完整副本。所以孩子可以访问由父母创建的指针,但只能访问在fork()
. 在 fork 之后,出于所有编程目的,每个进程都有一个父进程内存的副本。因此,父(或子)的更改被限制在他们自己的块中。
例如,假设父级有一个指向字符缓冲区的指针。parent fork()
s,所以现在 parent 和 child 都包含指向同一个块的相同指针。如果父进程或子进程更改该缓冲区,则其他进程不会看到更改。在硬件级别,内存块将位于其他位置。该进程在虚拟地址空间中运行,因此当两个程序内存块发生更改时,将为每个进程复制这部分内存(以及整个页面)。
将子代码放在函数中是没有问题的,实际上这是一个好主意。
推荐阅读
- java - 设置 IntelliJ 时字符显示不正确
- python - 打印输出看起来在长循环中拉伸
- c# - 如何防止用户访问其他用户的个人资料?
- django - 我可以在 django-models 中添加颜色选择器吗
- reactjs - 使用 Winterfell 响应表单
- firebase - 如何在不使用(已弃用)数据库机密的情况下将 Firebase 集成到 Google Apps 脚本中
- asp.net-core - 在具有 EF Core 迁移的 Net Core 类库上使用 settings.json
- matlab - 如何在 MATLAB 中调整条形绝对宽度
- c++ - Qt 对于我的带宽上限来说太大了。我的替代方案是什么?
- uitableview - 设置 UITableViewCellAccessory 的左 X 位置