有人能帮助我理解系统如何处理在进程进行fork()调用之前设置的变量。下面是我写的一个小测试程序,试着理解幕后发生的事情。
我知道进程的当前状态是“克隆”的,包括在分叉时包含的变量。我的想法是,如果在调用叉之前malloc有一个2D数组,那么我需要释放父进程和子进程中的数组。
从示例代码下面的结果可以看出,这两个值的作用就好像它们彼此完全分开,但它们具有完全相同的地址空间。我期望tmp的最终结果是-4,不管哪个进程先完成。
我对C和Linux比较新,有人能解释一下这是怎么可能的吗?也许变量tmp成为指向每个进程中不同的指针的指针?非常感谢。
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
int tmp = 1;
pid_t forkReturn= fork();
if(!forkReturn) {
/*child*/
tmp=tmp+5;
printf("Value for child %d\n",tmp);
printf("Address for child %p\n",&tmp);
}
else if(forkReturn > 0){
/*parent*/
tmp=tmp-10;
printf("Value for parent %d\n",tmp);
printf("Address for parent %p\n",&tmp);
}
else {
/*Error calling fork*/
printf("Error calling fork);
}
return 0;
}标准输出结果:
Value for child 6
Address for child 0xbfb478d8
Value for parent -9
Address for parent 0xbfb478d8发布于 2015-11-15 04:38:03
它确实复制了整个地址空间,并且在子进程中更改内存不会影响父进程。理解这一点的关键是要记住,指针只能指向您自己的进程中的某个东西,并且副本发生在较低的级别。
但是,您不应该在叉子中调用malloc()或free()。这会导致死锁(调用fork()时,另一个线程在malloc()中)。唯一安全调用子函数的函数也被列为信号处理程序的安全函数。以前,只有当您编写多线程代码时,我才能声称这是真的;然而,Apple很好地在标准库中生成了一个后台线程,所以死锁一直都是真实的。不应允许叉子从if块中脱落。打电话给_exit,确保没有。
https://stackoverflow.com/questions/33716396
复制相似问题