如何在Android中使用unix管道

Rob*_*Rob 9 unix android pipe root

我需要从Android中的应用程序向C程序发送一些数据,我想考虑使用管道.我读到Java 可以访问现有的管道(并打开它们,好像它是一个普通的文件),但我无法在我的应用程序中做这样的事情.当我尝试时,应用程序只是阻塞,直到消息等待关闭出现,而没有在logcat上写任何特殊内容.

在android邮件列表上发现了一个关于这个主题的帖子,但它不是很清楚,它指的是我手机上不存在的文件夹.

此外,我知道在SD卡上制作管道是不可能的,但是当我尝试这样做时/data,我认为我有根问题...你知道是否有可能访问该管道(我试着进出app文件夹没有成功)?

我用管道制作了管道mkfifo,任何用户都可以打开权限.

prw-rw-rw- root     root              2010-11-18 04:53 video_pipe
Run Code Online (Sandbox Code Playgroud)

我试图添加X权限(谁知道......)这是我的回复:

# chmod u+x video_pipe 
Bad mode
Run Code Online (Sandbox Code Playgroud)

阻止的代码是相机初始化(PATH只是管道的路径):

recorder.setOutputFile(PATH);
Run Code Online (Sandbox Code Playgroud)

以下是整个来源:https://github.com/rbochet/Simple-Camera-App/commits/piped(commit 22dba257f6)

Rob*_*Rob 9

好吧,我试图用最愚蠢的应用程序修复问题.你可以在github上找到这个作为一个要点.

到目前为止,我发现了这个:

  • 管道工作的唯一地方是app文件夹(即/data/data/package.full.name/)
  • 如果要将数据传递给其他程序,最好将其作为应用程序的子项启动,以确保它们位于同一组中,从而对该文件夹具有相同的权限.如果你没有,你也许可以用组玩可以(做ls -l -a/data/data/,看一看组名).

不要忘记:在有人在另一边聆听之前,你实际上无法写入管道.因此,如果您测试我在github上发布的文件,您将获得这种logcat结果.

I/ActivityManager(  220): Start proc fr.stackr.android.upt for activity fr.stackr.android.upt/.UnixPipeActivity: pid=1359 uid=10048 gids={}
I/UPIPE   ( 1359): Attempt started
W/ActivityManager(  220): Launch timeout has expired, giving up wake lock!
W/ActivityManager(  220): Activity idle timeout for HistoryRecord{4643c8b8 fr.stackr.android.upt/.UnixPipeActivity}
Run Code Online (Sandbox Code Playgroud)

在这里,系统暂停,因为没有任何反应...然后我cat v_pipe在电话上运行.

V/UPIPE   ( 1359): SEND :: Try to write the first paragraph ....
V/UPIPE   ( 1359): SEND :: Bip
V/UPIPE   ( 1359): Flushing...
V/UPIPE   ( 1359): SEND :: Bip post flush
V/UPIPE   ( 1359): Closing…
I/UPIPE   ( 1359): Attempt ended
Run Code Online (Sandbox Code Playgroud)

那已经完成了.

关闭:当我关闭时OutputStreamWriter,收听方(即cat)结束.如果我下线,cat仍会等待输入.

潮红:如果你打算在没有打电话的情况下获得一些东西,这似乎很重要.

回车:使用\n.