12

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

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

如此广泛地说,是否有任何方法可以访问父进程变量以及使用 fork() 创建的子进程中的状态。

4

3 回答 3

13

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

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

所以这是答案#1。


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

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

于 2012-05-11T04:58:40.087 回答
1

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

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

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

于 2012-05-11T08:36:59.570 回答
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";
于 2012-05-22T09:49:33.280 回答