首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >forked进程中的确定性malloc

forked进程中的确定性malloc
EN

Stack Overflow用户
提问于 2011-11-19 00:15:14
回答 4查看 289关注 0票数 2

我想要的是让forked进程(它是其父进程的副本)获得从每个malloc函数调用返回的与其父进程相同的地址。我如何才能做到这一点?

实际上,我试图实现的是有两个重复的进程,它们执行相同的事情。我这样做基本上是为了检测软错误,也就是说,如果有任何分歧,它一定是由于错误,而不是非确定性。现在,由于malloc是非确定性的,它将使两个进程出现分歧,这是我想要避免的。

如果不可能,我是否可以记录malloc为父进程返回的地址,并将相同的地址用于派生进程。这样行得通吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-11-19 00:19:07

使用malloc根本无法做到这一点。malloc的返回地址没有以任何方式定义为确定性的(特别是可移植的)。试图在进程之间同步,即使是子进程和父进程,也很可能是徒劳的。

你能给我们更多关于你为什么要这样做的细节吗?也许还有另一种方法可以达到你想要的效果。

票数 2
EN

Stack Overflow用户

发布于 2011-11-19 00:27:38

如果您的系统是Linux,那么您将通过禁用地址空间随机化来获得更多可重现的地址。您可以使用以下命令(以root用户身份运行)来实现这一点

代码语言:javascript
复制
echo 0 > /proc/sys/kernel/randomize_va_space

(但地址空间随机化是一个可以提高系统安全性的功能)

然而,这并不能保证父进程和子进程将获得相同的行为(因为它们之间有一个小小的区别:fork()和它们的pid的返回)。而且您不能确定它们的分配模式是否足够相似。想象一下,在fork之后,(forked)程序执行如下内容

代码语言:javascript
复制
 char *p = malloc (8192*(3 + (getpid() % 10) + time(NULL) % 100));

然后,您应该期望malloc在父级和子级中请求完全不同的大小,并使用不同的malloc返回地址。所以这个做作的例子表明你的需求是不现实的。

票数 3
EN

Stack Overflow用户

发布于 2012-05-21 22:12:58

你不能用标准的malloc做到这一点。但是您可以编写自己的自定义分配器,它具有确定性的分配方式。例如,使用足够大小的static char pool[POOL_SIZE];作为分配池,pool的地址在fork()上保持不变。所有指向pool的指针也一样。瞧!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8185435

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档