[問題] adb process 莫名咬住 created file

看板Perl作者 (~口卡口卡 修~)時間9年前 (2015/02/20 01:46), 9年前編輯推噓4(4016)
留言20則, 2人參與, 最新討論串1/2 (看更多)
不確定這個問題該 po 到 Android 還是 Perl 版 最近用 Perl 寫有關 adb debugging 遇到一個詭異的問題 就是執行 perl 途中, adb process 會咬住 file created from perl 後來把問題 narrow down 成以下 script: ================================= use strict; my $test = "out.log"; system("adb kill-server"); # (1) open FILE, "> $test"; # (2) system("adb shell ls"); # (3) close FILE; unlink $test or die "Q_Q\n"; ================================= 只要執行該 script, console 一定會顯示 Q_Q (當然前提是 找的到 adb 程式 和 usb driver) 但若只要在 open file 前, 讓 adb daemon 可以起來 例如在 #(1) 和 #(2) 之間呼叫 adb remount: ================================= system("adb kill-server"); # (1) system("adb remount"); # (4) open FILE, "> $test"; # (2) ================================= 這樣的 script 就不會印出 Q_Q 了 不知道是不是因為 adb 起來的時候動到 file descriptor 讓檔案以為是 adb.exe 叫起來 但相同的邏輯,用 Python 跑卻沒事情 麻煩版上的大神們能幫忙指點迷津 感謝~ -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.221.50.98 ※ 文章網址: https://www.ptt.cc/bbs/Perl/M.1424367968.A.AA8.html

02/21 03:09, , 1F
有點小叉題但想請教一下 在幾種呼叫其他程式的方法中
02/21 03:09, 1F

02/21 03:10, , 2F
也就是 system(), exec(), qr//, IPC:: 之類等等,
02/21 03:10, 2F

02/21 03:10, , 3F
原po是比較過python和perl的ipc, fork, 有無shell中介..等等
02/21 03:10, 3F

02/21 03:13, , 4F
機制後 採用了python中和perl的system()的對等指令後
02/21 03:13, 4F

02/21 03:13, , 5F
才說是「相同的邏輯,用 Python 跑卻沒事情」這樣的敘述是嗎
02/21 03:13, 5F

02/21 03:13, , 6F
回到原題,試試 system LIST 或 exec跑看看囉
02/21 03:13, 6F

02/21 03:14, , 7F
另外return value,$OS_ERROR(with use ENGLISH)的也都看看
02/21 03:14, 7F

02/21 03:14, , 8F
會比較好吧
02/21 03:14, 8F

02/21 03:20, , 9F
*第二列推文的 qr// 要改成 qx//
02/21 03:20, 9F
--- Python 部分我目前只有試過 subprocess.call 至於 Perl or Python 內部如何運作,這我就不太了解 QQ 然後我試了一下您的建議 <a> system return value = 0, no error in $! <b> 用 fork + exec 取代 system call, 也會發生 adb 咬檔事件 <c> 用 qx// 取代 system call, sub process 會卡住 關於這點,我發現跟 file open/close 一點關係也沒有 而是只要執行以下命令: ----------------------------- system("adb kill-server"); `adb shell ls`; ____(*) ----------------------------- 那當 perl 跑到 (*) 那行時會莫名卡著... ps: 不想要 (*) 卡著,只要在前面用 system call 隨便呼叫 adb cmd 即可 快分不清是 Perl/adb 有 bug, 還是我哪邊沒搞清楚 ※ 編輯: doom8199 (61.221.50.98), 02/21/2015 23:18:06

02/22 00:47, , 10F
黃色的那一列是想表達 system('adb shell ls') 執行後會停在
02/22 00:47, 10F

02/22 00:48, , 11F
那一列,不會進行到下一列是嗎?
02/22 00:48, 11F

02/22 00:55, , 12F
對了 我想你17~27列的程式會那樣是因為檔案$test不在,所以Q_Q
02/22 00:55, 12F

02/22 00:58, , 13F
如果你對 adb shell的回傳值有疑惑的話 http://x.co/7o1Rt
02/22 00:58, 13F

02/22 01:00, , 14F
但是那文章描述的問題我認知上似乎與你的只是類似 但不同
02/22 01:00, 14F

02/22 01:03, , 15F
另外我猜你的OS是win系列 這樣就與un*x的fork有大大的不同
02/22 01:03, 15F

02/22 01:05, , 16F
只是順道一提 和要解決你的case應該沒有很大的關聯吧...
02/22 01:05, 16F

02/22 18:44, , 17F
不是檔案不存在, 是 "$test file 真的被 adb.exe 使用"
02/22 18:44, 17F

02/22 18:46, , 18F
才造成砍檔失敗。想要砍檔成功,只能先 kill-server
02/22 18:46, 18F

02/22 18:48, , 19F
另外我目前遇到的問題的確是在 win series
02/22 18:48, 19F

02/22 18:50, , 20F
晚一點會在 linux 上用 emulator 試看看有沒有同樣問題
02/22 18:50, 20F
文章代碼(AID): #1KvY5Wge (Perl)
文章代碼(AID): #1KvY5Wge (Perl)