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

如何在perl中使用fork时在子进程和父进程之间共享变量,perl,global-variables,ipc,fork,shared,Perl,Global Variables,Ipc,Fork,Shared,我在代码中使用fork。在代码中进行fork调用之前,父进程声明了一个全局变量。因此,在fork调用之后,子进程会在其自己的线程堆栈上获取全局变量的单独副本,或者共享全局变量的现有父实例。所以我想这里有三种可能性 1) 子进程获取在父进程中声明的全局变量的单独实例 2) 子进程与父线程共享全局变量。(这可能不是真的) 3) 子进程没有关于父线程中全局变量的任何信息 如果2个或3个选项为true,我想知道是否有任何方法可以获取全局变量及其在子进程的父线程中声明的“fork()执行时的状态/值” 从

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

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


从广义上讲,是否有任何方法可以访问父进程变量以及使用fork()创建的子进程中的状态。

每个进程都有自己的内存空间。一个进程通常不能访问另一个进程的内存

对于
fork
,子进程的内存空间从父进程的精确副本开始。其中包括变量、代码等。在一个变量中更改其中任何一个都不会更改另一个变量中的任何类似变量

答案是#1


即使可以,您应该问的问题也不是“如何共享变量?”而是“如何交换数据?”。有一个受控的通道是不容易出错的,因为它提供了更松散的耦合和更少的行动在一个距离

管道通常用于在父进程和子进程之间进行通信,但还有许多其他选项。

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

分离进程的意义在于分离内存。因此,一旦发生分叉,就不能在父进程和子进程之间共享变量

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

代码示例:

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";