我想要的是让forked进程(它是其父进程的副本)获得从每个malloc函数调用返回的与其父进程相同的地址。我如何才能做到这一点?
实际上,我试图实现的是有两个重复的进程,它们执行相同的事情。我这样做基本上是为了检测软错误,也就是说,如果有任何分歧,它一定是由于错误,而不是非确定性。现在,由于malloc是非确定性的,它将使两个进程出现分歧,这是我想要避免的。
如果不可能,我是否可以记录malloc为父进程返回的地址,并将相同的地址用于派生进程。这样行得通吗?
发布于 2011-11-19 00:19:07
使用malloc根本无法做到这一点。malloc的返回地址没有以任何方式定义为确定性的(特别是可移植的)。试图在进程之间同步,即使是子进程和父进程,也很可能是徒劳的。
你能给我们更多关于你为什么要这样做的细节吗?也许还有另一种方法可以达到你想要的效果。
发布于 2011-11-19 00:27:38
如果您的系统是Linux,那么您将通过禁用地址空间随机化来获得更多可重现的地址。您可以使用以下命令(以root用户身份运行)来实现这一点
echo 0 > /proc/sys/kernel/randomize_va_space(但地址空间随机化是一个可以提高系统安全性的功能)
然而,这并不能保证父进程和子进程将获得相同的行为(因为它们之间有一个小小的区别:fork()和它们的pid的返回)。而且您不能确定它们的分配模式是否足够相似。想象一下,在fork之后,(forked)程序执行如下内容
char *p = malloc (8192*(3 + (getpid() % 10) + time(NULL) % 100));然后,您应该期望malloc在父级和子级中请求完全不同的大小,并使用不同的malloc返回地址。所以这个做作的例子表明你的需求是不现实的。
发布于 2012-05-21 22:12:58
你不能用标准的malloc做到这一点。但是您可以编写自己的自定义分配器,它具有确定性的分配方式。例如,使用足够大小的static char pool[POOL_SIZE];作为分配池,pool的地址在fork()上保持不变。所有指向pool的指针也一样。瞧!
https://stackoverflow.com/questions/8185435
复制相似问题