如何在Android中使用unix管道

时间:2011-05-17 04:48:57

标签: android unix pipe root

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

我找到了关于这个主题的thread on android mailing lists,但它不是很清楚,它指的是我手机上不存在的文件夹。

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

我使用mkfifo创建了管道,任何用户都可以打开权限。

prw-rw-rw- root     root              2010-11-18 04:53 video_pipe

我尝试添加X权限(谁知道......)以下是我的回复:

# chmod u+x video_pipe 
Bad mode

阻止的代码是camera initialisationPATH只是管道的路径):

recorder.setOutputFile(PATH);

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

2 个答案:

答案 0 :(得分:9)

好的,我尝试用最愚蠢的应用程序解决问题。你可以找到这个as a gist on 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}

此处,系统暂停,因为没有任何反应......然后我在手机上运行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

已经完成了。

关闭:当我关闭OutputStreamWriter时,收听方(即cat)结束。 如果我提交该行,cat仍会等待输入。

刷新:如果您打算在没有打电话的情况下获得某些内容,这似乎很重要。

回车:使用\n

答案 1 :(得分:2)

我认为您可以使用ParcelFileDescriptor.createPipe()

它将返回一个用于读写的管道数组。有关更多信息,请访问开发人员网站。