我在代码中使用fork。在我的代码中进行分叉调用之前,父进程声明了一个全局变量。因此,在 fork 调用之后,子进程是否在其自己的线程堆栈上获取全局变量的单独副本或共享全局变量的现有父实例。所以我想这里有三种可能性1) 子进程获取在父进程中声明的全局变量的单独实例2) 子进程与父线程共享全局变量。(这可能不是真的)3) 子进程在父线程中没有任何关于全局变量的信息
如果 2 或 3 个选项为真,我想知道是否有任何方法可以获取全局变量及其在子进程中的父线程中声明的"执行 fork()时的状态/值"。
从广义上讲,有没有办法访问父进程变量,并且使用 fork() 创建的子进程中的状态。
每个进程都有自己的内存空间。一个进程通常无法访问另一个进程的内存。
在fork
的情况下,子进程的内存空间以父进程的精确副本开始。这包括变量、代码等。在一个变量中更改其中任何一个都不会更改另一个变量中的任何一个类似的变量。
所以这是答案#1。
即使可以,你应该问的问题也不是"我如何共享变量?"而是"我如何交换数据?"。拥有受控通道不太容易出错,因为它提供更松散的耦合和更少的远距离动作。
管道通常用于在父级和子项之间进行通信,但还有许多其他选项。
情况"1)子进程获取在父进程中声明的全局变量的单独实例"。
分离进程的要点是分离内存。因此,一旦发生分叉,就无法在父进程和子进程之间共享变量。
您应该查看perlipc手册页,其中列出了进程间通信(IPC)的其他一些选项。看看其他关于父子沟通的StackOverflow问题。
代码示例:
my $ipckey = IPC_PRIVATE;
my $idshm = shmget( $ipckey, 200, 0666 ) || die "nCreation shared memory failed $! n";
shmread( $idshm, $xxx, 0, 1 ) || warn "nn shmread $! n";
shmwrite( $idshm, $xxx , 0, 1 ) || warn "nn shmwrite $! n";