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
    }
}

したがって、このスクリプトが終了すると、子プロセスに記述した 2 つの要素は foreach ループの最後にはありません。親pidにある配列を子から変更できません。理由はわかりますが、それを可能にする素晴らしい解決策が思いつきません。何か提案できますか?グローバルか何か?

4

2 に答える 2

3

共有メモリを使用してみてください: http://www.php.net/manual/en/ref.shmop.php

共有メモリの名前がよく知られていると、必要に応じて親と子で shmop_open() できるようになります。2 つの書き込みが同時に発生しないように、セマフォを使用してこの共有メモリを保護する必要があります。つまり、共有メモリに相互排他ロックを設定します。

于 2011-07-26T20:42:50.977 に答える
3

親/子プロセスは、同じ stdin/stdout を共有します。PARENTプロセスが各 fork() 呼び出しの前に stdin/stdout を再マップする場合、各子に専用の stdin/stdout を設定できます。これにより、独自の通信チャネルを使用して各子供と話すことができ、各子供の話を個別に聞くこともできます。

次に、単純な通信プロトコルを考え出すだけで、変更されたデータを子プロセスから親プロセスに戻すことができます。

于 2011-07-26T20:38:51.553 に答える