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(),没有发生任何变化! // 子进程无法修改主进程中的数据。 // 子进程中该如何修改主进程中的数据,实现数据共享??}
结果:
进程间该如何进行数据交流??
问题解答
回答1:子进程创建后,已经与父进程的变量数据脱钩,如果要实现子进程修改父进程变量,需要通过进程间通讯并自行实现相关代码来完成。当然,也可以通过共享内存的方式实现变量的共享。
回答2:进程间通信可用的方法多了去了。最常见的,TCP。
回答3:刚好在学习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); }
相关文章:
1. docker-machine添加一个已有的docker主机问题2. javascript - 如何获取未来元素的父元素在页面中所有相同元素中是第几个?3. node.js - node express 中ajax post请求参数接收不到?4. java - 原生CGLib内部方法互相调用时可以代理,但基于CGLib的Spring AOP却代理失效,为什么?5. apache - nginx 日志删除后 重新建一个文件 就打不了日志了6. java - tomcat服务经常晚上会挂,求解?7. javascript - 用jsonp抓取qq音乐总是说回调函数没有定义8. 怎么能做出标签切换页的效果,(文字内容随动)9. 谁有mysql5.7安装的详细教程10. chrome浏览器怎么使用
