1

我希望能够修改父 pid 中的数组元素。这是一些示例代码:

$arrayContainer = array(
    array(
          "id" => 1,
          "name" => "Lenny"
    ),
    array(
          "id" => 2,
          "name" => "Dudley"
    ),
    array(
          "id" => 3,
          "name" => "Simon"
    ),
);

foreach ($arrayContainer as $key => $element) {
    $pid = pcntl_fork();
    if($pid == -1) {
        // Something went wrong (handle errors here)
        die("Could not fork!");
    } elseif($pid == 0) {
        $arrayContainer[$key]['size'] = 123;
        $arrayContainer[$key]['fileName'] = 'somefile.txt';
        // The child dies after a short while, becoming a zombie
        exit();  
    } else {
        // This part is only executed in the parent
    }
}

因此,当此脚本结束时,我在子进程中编写的两个元素在 foreach 循环结束时不存在。我无法从孩子修改父 pid 中的数组。我明白为什么,但想不出一个能让我这样做的好解决方案。你能提出什么建议吗?全局变量什么的?

4

2 回答 2

3

父/子进程将共享相同的标准输入/标准输出。如果PARENT进程在每次 fork() 调用之前重新映射其标准输入/标准输出,则您可以为每个子进程使用专用标准输入/标准输出。这将使您可以使用自己的通信渠道与每个孩子交谈,并单独倾听每个孩子的声音。

然后,只需提出一个简单的通信协议,让孩子将修改后的数据传回给父母,这就是一件简单的事情。

于 2011-07-26T20:38:51.553 回答
3

你应该尝试使用共享内存:http ://www.php.net/manual/en/ref.shmop.php

拥有一个众所周知的共享内存名称将使您可以根据需要在父级和子级中使用 shmop_open()。请注意,您应该使用信号量来保护此共享内存,因此不会同时发生两次写入。也就是在共享内存上有一个互斥锁

于 2011-07-26T20:42:50.977 回答