当我在Perl中分叉一个进程时,子进程能否看到它的父进程';s数据

当我在Perl中分叉一个进程时,子进程能否看到它的父进程';s数据,perl,fork,Perl,Fork,假设我正在构建一个webcrawler,我有一个包含所有访问URL的哈希 当我分叉子进程时,我希望能够从子进程访问访问的URL的散列,但我不想复制散列,因为它很大,会耗尽计算机内存 当我使用Parallel::ForkManager进行fork并打印在父进程中声明的哈希的地址时,我从父进程和子进程打印时会得到相同的地址,例如哈希(0x7fc59d017f38) 但是我想确保数据结构没有被复制到子进程否。每个进程都有自己的地址空间。子对象的地址空间从其父对象的副本开始,但更改其中一个地址空间对另一

假设我正在构建一个webcrawler,我有一个包含所有访问URL的哈希

当我分叉子进程时,我希望能够从子进程访问访问的URL的散列,但我不想复制散列,因为它很大,会耗尽计算机内存

当我使用Parallel::ForkManager进行fork并打印在父进程中声明的哈希的地址时,我从父进程和子进程打印时会得到相同的地址,例如哈希(0x7fc59d017f38)


但是我想确保数据结构没有被复制到子进程

否。每个进程都有自己的地址空间。子对象的地址空间从其父对象的副本开始,但更改其中一个地址空间对另一个地址空间没有影响。您需要使用各种可能的通信通道(管道、memcached、数据库、文件等)之一显式交换要“共享”的数据。

您使用的是绿色线程还是本机线程
perl-v
将有所帮助。在U*x(包括OSX)上,子级无法访问父级。但是,它继承父内存的完整副本(通常优化为写时复制)。在其他平台上,某些细节可能会有所不同。子进程可以访问在fork时刻获取的父进程数据的快照。@darwin-thread-multi-2level程序员可否让子进程在子进程处理完URL后将其URL(不保存)传递给父进程进行存储,或者孩子需要它们作为将来的参考?如果孩子不需要把它们留在身边,你可以使用IO::Pipe::Producer将URL传递给家长。谢谢,但为什么我打印哈希
say\%hash;如果(fork==0){say\%hash}
Yes,则相同的地址在两个不同的地址空间中。有点像两个人在两个不同的城市有相同的街道地址。这并不意味着他们共用一间浴室。内存地址不是指内存芯片上的位置,而是指进程地址空间中的位置;如果(my$pid=fork){waitpid($pid,0);说$hash{abc}}否则{$hash{abc}=456;}