ubuntu - pcntl 子進程引用并修改父進程數(shù)據(jù)的問題??
問題描述
代碼:
$data = array();$p = pcntl_fork();if ($p === -1) { exit(’創(chuàng)建進程失敗!’ . PHP_EOL);} else if ($p === 0) { // 修改主進程中的數(shù)據(jù) $data = array(’cxl’ , ’ys’);} else { pcntl_wait($status);// 子進程返回后,查看數(shù)據(jù)變動 print_r($data); // 結(jié)果 array(),沒有發(fā)生任何變化! // 子進程無法修改主進程中的數(shù)據(jù)。 // 子進程中該如何修改主進程中的數(shù)據(jù),實現(xiàn)數(shù)據(jù)共享??}
結(jié)果:
進程間該如何進行數(shù)據(jù)交流??
問題解答
回答1:子進程創(chuàng)建后,已經(jīng)與父進程的變量數(shù)據(jù)脫鉤,如果要實現(xiàn)子進程修改父進程變量,需要通過進程間通訊并自行實現(xiàn)相關(guān)代碼來完成。當然,也可以通過共享內(nèi)存的方式實現(xiàn)變量的共享。
回答2:進程間通信可用的方法多了去了。最常見的,TCP。
回答3:剛好在學習pcntl,也想到進程間通信的事情,搜到的其中一個可用方法-使用消息隊列,覺得不太復雜,于是在你代碼上加了幾句,可以試試,互助共勉。
// 創(chuàng)建key和消息隊列$msg_key = ftok(__FILE__, ’a’);$msg_queue = msg_get_queue($msg_key);$data = array();$p = pcntl_fork();if ($p === -1) { exit(’創(chuàng)建進程失敗!’ . PHP_EOL);} else if ($p === 0) { // 修改主進程中的數(shù)據(jù) // 將修改的數(shù)據(jù)發(fā)送到消息隊列 msg_send($msg_queue, 1, array(’cxl’ , ’ys’)); exit();} else { pcntl_wait($status);// 子進程返回后,查看數(shù)據(jù)變動 // 接收隊列中的數(shù)據(jù) msg_receive($msg_queue, 1, $msg_type, 1024, $msg); // 銷毀隊列 msg_remove_queue($msg_queue);$data = $msg; print_r($data); }
相關(guān)文章:
1. 在應用配置文件 app.php 中找不到’route_check_cache’配置項2. html按鍵開關(guān)如何提交我想需要的值到數(shù)據(jù)庫3. HTML 5輸入框只能輸入漢字、字母、數(shù)字、標點符號?正則如何寫?4. javascript - 請教如何獲取百度貼吧新增的兩個加密參數(shù)5. gvim - 誰有vim里CSS的Indent文件, 能縮進@media里面的6. 跟著課件一模一樣的操作使用tp6,出現(xiàn)了錯誤7. PHP類屬性聲明?8. javascript - JS請求報錯:Unexpected token T in JSON at position 09. objective-c - ios 怎么實現(xiàn)微信聯(lián)系列表 最好是swift10. java - 安卓接入微信登錄,onCreate不會執(zhí)行
