【问题标题】:How to get variables shared between child and parent process while using fork in perl在perl中使用fork时如何在子进程和父进程之间共享变量
【发布时间】:2012-05-19 16:18:26
【问题描述】:

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

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

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

【问题讨论】:

    标签: perl global-variables ipc fork shared


    【解决方案1】:

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

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

    所以这是答案 #1。


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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

        代码示例:

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

        【讨论】:

          猜你喜欢
          • 2013-12-24
          • 1970-01-01
          • 2012-04-09
          • 1970-01-01
          • 2016-12-14
          • 2017-03-15
          • 2010-09-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多