搜尋

首頁  >  問答  >  主體

ubuntu - pcntl 子程序引用並修改父進程資料的問題? ?

代碼:

$data = array();
$p = pcntl_fork();

if ($p === -1) {
    exit('创建进程失败!' . PHP_EOL);
} else if ($p === 0) {
    // 修改主进程中的数据
    $data = array('cxl' , 'ys');
} else {
    pcntl_wait($status);
    
    // 子进程返回后,查看数据变动
    print_r($data); // 结果 array(),没有发生任何变化!
                    // 子进程无法修改主进程中的数据。
                    // 子进程中该如何修改主进程中的数据,实现数据共享??
}

結果:

進程間該如何進行資料交流? ?

怪我咯怪我咯2832 天前807

全部回覆(3)我來回復

  • 大家讲道理

    大家讲道理2017-04-24 09:14:06

    子進程創建後,已經與父進程的變量資料脫鉤,如果要實現子進程修改父進程變量,需要透過進程間通訊並自行實現相關程式碼來完成。當然,也可以透過共享記憶體的方式實現變數的共享。

    回覆
    0
  • PHPz

    PHPz2017-04-24 09:14:06

    進程間通訊可用的方法多了去了。最常見的,TCP。

    回覆
    0
  • 迷茫

    迷茫2017-04-24 09:14:06

    剛好在學習pcntl,也想到進程間通訊的事情,搜到的其中一個可用方法-使用訊息佇列,覺得不太複雜,於是在你程式碼上加了幾句,可以試試,互助共勉。

    // 创建key和消息队列
    $msg_key = ftok(__FILE__, 'a');
    $msg_queue = msg_get_queue($msg_key);
    
    $data = array();
    $p = pcntl_fork();
    
    if ($p === -1) {
        exit('创建进程失败!' . PHP_EOL);
    } else if ($p === 0) {
        // 修改主进程中的数据
        // 将修改的数据发送到消息队列
        msg_send($msg_queue, 1, array('cxl' , 'ys'));
        exit();
    } else {
        pcntl_wait($status);
        
        // 子进程返回后,查看数据变动
        // 接收队列中的数据
        msg_receive($msg_queue, 1, $msg_type, 1024, $msg);
        // 销毁队列
        msg_remove_queue($msg_queue);
        
        $data = $msg;
        print_r($data); 
    }

    回覆
    0
  • 取消回覆