Maison  >  Questions et réponses  >  le corps du texte

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(),没有发生任何变化!
                    // 子进程无法修改主进程中的数据。
                    // 子进程中该如何修改主进程中的数据,实现数据共享??
}

结果:

进程间该如何进行数据交流??

怪我咯怪我咯2734 Il y a quelques jours747

répondre à tous(3)je répondrai

  • 大家讲道理

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

    Une fois le processus enfant créé, il a été découplé des données variables du processus parent. Si vous souhaitez que le processus enfant modifie les variables du processus parent, vous devez implémenter le code approprié via la communication inter-processus et l'implémenter. c'est vous-même. Bien entendu, les variables peuvent également être partagées via la mémoire partagée.

    répondre
    0
  • PHPz

    PHPz2017-04-24 09:14:06

    Il existe de nombreuses méthodes disponibles pour la communication inter-processus. Le plus courant, TCP.

    répondre
    0
  • 迷茫

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

    Je venais d'apprendre PCntl, et j'ai aussi pensé à la communication inter-processus. J'ai trouvé l'une des méthodes disponibles - utiliser les files d'attente de messages. J'ai pensé que ce n'était pas trop compliqué, alors j'ai ajouté quelques phrases à votre code. Je peux l'essayer et m'entraider.

    // 创建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); 
    }

    répondre
    0
  • Annulerrépondre