I need to send some data to a C program from my app in Android, and I think about using pipes. I read that Java can access to existing pipes (and open them as if it's a normal file), but I'm unable to do such a thing in my application. When I try, the app just block until the message wait close appears, without writing anything special on logcat.
I found a thread on android mailing lists about this subject, but it was not very clear, and it refers to a folder that does not exist on my phone.
Furthermore, I know it's not possible to make pipes on the sdcard, but when I try to do so in/data
, I think I have root issues… Do you know if it is possible to access to that pipe (I try in and out of the app folder without success)?
I made the pipe with mkfifo
, and the permissions seems OK to be open by any user.
prw-rw-rw- root root 2010-11-18 04:53 video_pipe
I tried to add the X permission (who knows...) Here is what I have back:
# chmod u+x video_pipe
Bad mode
The code that blocks is the camera initialisation (PATH
is just the path to the pipe):
recorder.setOutputFile(PATH);
Here is the whole source : https://github.com/rbochet/Simple-Camera-App/commits/piped (commit 22dba257f6)
A pipe consists of a pair of channels: A writable sink channel and a readable source channel. Once some bytes are written to the sink channel they can be read from source channel in exactlyAthe order in which they were written.
Pipe is used to combine two or more commands, and in this, the output of one command acts as input to another command, and this command's output may act as input to the next command and so on. It can also be visualized as a temporary connection between two or more commands/ programs/ processes.
What Is a Pipe? A pipe is an important mechanism in Unix-based systems that allows us to communicate data from one process to another without storing anything on the disk. In Linux, we have two types of pipes: pipes (also known as anonymous or unnamed pipes) and FIFO's (also known as named pipes).
Ok, I tried to fix the problem with the most stupid app that exists. You can find this one as a gist on github.
So far, I discover this :
/data/data/package.full.name/
)ls -l -a
on /data/data/
and have a look to the group name).DO NOT FORGET : You can't actually write in the pipe until someone is listening at the other side. So if you test the file I posted on github, you will have that kind of logcat result.
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}
Here, the system pause because nothing happens… Then I run cat v_pipe
on the phone.
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
That's done.
closing : when I close the OutputStreamWriter
, the listening side (ie cat
) ends.
If I commment the line, cat
will still wait for input.
flushing : seems to be important if you intent to get something without calling close.
Carriage Return : Use \n
.
I think you can use ParcelFileDescriptor.createPipe()
It will return an array of pipe for read and write. For more information, visit the developers website.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With