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 images顯示的鏡像過多,狗眼被亮瞎了,怎么辦?2. angular.js - angularjs如何傳遞id給另一個視圖 根據id獲取json數據?3. 數據庫無法進入4. mysql - 記得以前在哪里看過一個估算時間的網站5. docker-compose 為何找不到配置文件?6. boot2docker無法啟動7. select - mysql怎么搜索一個字符串指定位置之后兩位8. python - linux怎么在每天的凌晨2點執行一次這個log.py文件9. android - E/dalvikvm: Could not find class java.nio.file.Path,10. 請問一下各位老鳥 我一直在學習獨孤九賤 現在是在tp5 今天發現 這個系列視頻沒有實戰
