作者doom8199 (~口卡口卡 修~)
看板Perl
标题[问题] adb process 莫名咬住 created file
时间Fri Feb 20 01:46:05 2015
不确定这个问题该 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://webptt.com/cn.aspx?n=bbs/Perl/M.1424367968.A.AA8.html
1F:推 flu: 有点小叉题但想请教一下 在几种呼叫其他程式的方法中 02/21 03:09
2F:→ flu: 也就是 system(), exec(), qr//, IPC:: 之类等等, 02/21 03:10
3F:→ flu: 原po是比较过python和perl的ipc, fork, 有无shell中介..等等 02/21 03:10
4F:→ flu: 机制後 采用了python中和perl的system()的对等指令後 02/21 03:13
5F:→ flu: 才说是「相同的逻辑,用 Python 跑却没事情」这样的叙述是吗 02/21 03:13
6F:→ flu: 回到原题,试试 system LIST 或 exec跑看看罗 02/21 03:13
7F:→ flu: 另外return value,$OS_ERROR(with use ENGLISH)的也都看看 02/21 03:14
8F:→ flu: 会比较好吧 02/21 03:14
9F:→ flu: *第二列推文的 qr// 要改成 qx// 02/21 03:20
---
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
10F:推 flu: 黄色的那一列是想表达 system('adb shell ls') 执行後会停在 02/22 00:47
11F:→ flu: 那一列,不会进行到下一列是吗? 02/22 00:48
12F:推 flu: 对了 我想你17~27列的程式会那样是因为档案$test不在,所以Q_Q 02/22 00:55
14F:→ flu: 但是那文章描述的问题我认知上似乎与你的只是类似 但不同 02/22 01:00
15F:→ flu: 另外我猜你的OS是win系列 这样就与un*x的fork有大大的不同 02/22 01:03
16F:→ flu: 只是顺道一提 和要解决你的case应该没有很大的关联吧... 02/22 01:05
17F:→ doom8199: 不是档案不存在, 是 "$test file 真的被 adb.exe 使用" 02/22 18:44
18F:→ doom8199: 才造成砍档失败。想要砍档成功,只能先 kill-server 02/22 18:46
19F:→ doom8199: 另外我目前遇到的问题的确是在 win series 02/22 18:48
20F:→ doom8199: 晚一点会在 linux 上用 emulator 试看看有没有同样问题 02/22 18:50