[lug] named pipe missunderstanding

Anthony Foiani tkil at scrye.com
Tue Feb 1 16:11:39 MST 2011


Jason Davis <jdavis at openactive.org> writes:

> I think I have a missunderstanding about named pipes. Im using them
> for IPC and Im losing data.

Your update says that you get an inconsistent number of *reads*.

Do you get an inconsistent number of *bytes*, though?  Named pipes do
not packetize their content.

  $ ls -al fedora11-i386-dvd.img 
  -rw-rw-r--. 1 tony tony 3683844096 Oct 15  2009 fedora11-i386-dvd.img

  $ mkfifo my-pipe

  $ dd if=my-pipe of=tmp.img bs=1M &
  [1] 2412
  $ dd if=fedora11-i386-dvd.img of=my-pipe bs=1M
  3513+1 records in
  3513+1 records out
  3683844096 bytes (3.7 GB) copied, 227.972 s, 16.2 MB/s
  3513+1 records in
  3513+1 records out
  3683844096 bytes (3.7 GB) copied, 227.966 s, 16.2 MB/s
  [1]+  Done                    dd if=my-pipe of=tmp.img bs=1M

  $ md5sum fedora11-i386-dvd.img tmp.img 
  8bb458918512bcd41a834ca05b92d252  fedora11-i386-dvd.img
  8bb458918512bcd41a834ca05b92d252  tmp.img

If the reading process happens to loop while the writing process is
*not* writing to the pipe, the reader will see EOF.

In terminal 1:

  $ cat *.pdf > ../all.pdf

  $ for i in *.pdf ; do dd if="$i" of=my-pipe bs=16k ; done
  1+1 records in
  1+1 records out
  19070 bytes (19 kB) copied, 0.000147709 s, 129 MB/s
  425+1 records in
  425+1 records out
  6976935 bytes (7.0 MB) copied, 0.128906 s, 54.1 MB/s
  253+1 records in
  253+1 records out
  4153413 bytes (4.2 MB) copied, 0.0641728 s, 64.7 MB/s
  253+1 records in
  253+1 records out
  4153413 bytes (4.2 MB) copied, 0.0684014 s, 60.7 MB/s
  8+1 records in
  8+1 records out
  135683 bytes (136 kB) copied, 0.00947213 s, 14.3 MB/s
  33+1 records in
  33+1 records out
  556324 bytes (556 kB) copied, 0.00314683 s, 177 MB/s

In terminal 2:

  $ dd if=my-pipe of=out1.pdf bs=1M
  12+7 records in
  12+7 records out
  15438514 bytes (15 MB) copied, 0.297442 s, 51.9 MB/s
  $ dd if=my-pipe of=out2.pdf bs=1M
  0+3 records in
  0+3 records out
  1593046 bytes (1.6 MB) copied, 0.0785324 s, 20.3 MB/s
  $ dd if=my-pipe of=out3.pdf bs=16k
  12+1 records in
  12+1 records out
  201281 bytes (201 kB) copied, 0.0184194 s, 10.9 MB/s
  $ dd if=my-pipe of=out4.pdf bs=1M
  1+2 records in
  1+2 records out
  1282032 bytes (1.3 MB) copied, 0.0298385 s, 43.0 MB/s

But I'm pretty sure that all the data will eventually be sent.  Using
the same command in terminal 1 to send each file individually, I can
use 'cat' to capture them in terminal 2:

   $ rm ../all2.pdf

   $ while true ; do cat my-pipe >> ../all2.pdf ; done
   ^C

   $ ls -al ../all*
   -rw-rw-r--. 1 tony tony 60324399 Feb  1 16:08 ../all2.pdf
   -rw-rw-r--. 1 tony tony 60324399 Feb  1 15:47 ../all.pdf

   $ md5sum ../all*
   38257d8db7a14d2d3ba69ad145697ee8  ../all2.pdf
   38257d8db7a14d2d3ba69ad145697ee8  ../all.pdf

I did have some issues using 'dd' to *receive* the data; I'm not sure
what was going on there.

HTH,
t.




More information about the LUG mailing list