如何在perl中使用fork时在子进程和父进程之间共享变量

时间:2012-05-11 03:34:25

标签: perl global-variables ipc fork shared

我在代码中使用fork。在我的代码中调用fork之前,父进程声明了一个全局变量。因此,在fork调用之后,子进程在其自己的线程堆栈上获取全局变量的单独副本,或者共享全局变量的现有父实例。所以我想这里有三种可能性 1)子进程获取父进程中声明的全局变量的单独实例 2)子进程与父线程共享全局变量。 (这可能不是真的) 3)子进程没有任何关于父线程中的全局变量的信息

如果2或3选项为真,我想知道在子进程中是否有任何方法可以获取全局变量及其在执行fork()时的“状态/值”在父线程中声明。

如此广泛地说,有没有办法访问父进程变量,并且在使用fork()创建的子进程中有状态。

3 个答案:

答案 0 :(得分:12)

每个进程都有自己的内存空间。进程通常无法访问其他进程的内存。

fork的情况下,子进程的内存空间以父对象的精确副本开头。这包括变量,代码等。在一个中更改任何这些变量不会改变另一个中的任何类似变量。

所以答案是#1。


即使你可以,你应该问的问题不是“我如何分享变量?”但“我如何交换数据?”。拥有受控通道不易出错,因为它提供了更松散的耦合和更少的距离动作。

管道通常用于父母和孩子之间的沟通,但还有许多其他选择。

答案 1 :(得分:1)

这是案例“1)子进程获取父进程中声明的全局变量的单独实例”。

单独进程的重点是分离内存。因此,一旦发生fork,你就无法在父进程和子进程之间共享变量。

您应该查看perlipc手册页,其中列出了进程间通信(IPC)的其他一些选项。并查看有关父子沟通的其他StackOverflow问题。

答案 2 :(得分:1)

代码示例:

my $ipckey = IPC_PRIVATE;
my $idshm = shmget( $ipckey, 200, 0666 ) || die "\nCreation shared memory failed $! \n";

shmread( $idshm, $xxx, 0, 1 ) || warn "\n\n shmread $! \n";

shmwrite( $idshm, $xxx , 0, 1 ) || warn "\n\n shmwrite $! \n";