qm <Brad Allen wrote:
> I don't have time to complete this right now; putting
> |bfr inbetween the two fixes it and it makes my script work.
> If I have time I can do this later.
> 
> Given the following test file named "test", whose
> contents and size do not matter if size is greater than
> 1023, then we get:
> 
> while true; do dd if=test bs=1023 skip=1 2> /dev/null |
> dd bs=32768 count=1  2>/dev/null|wc -c; done
> 
> the output is:
> 
> sometimes 1023, sometimes greater.
> 
> It should always be equal to the size of the file-1023 or 32768,
> whichever is smaller.

I can confirm this behaviour (after waiting for a few mins) by doing:

dd bs=31023 if=/dev/zero of=test.dd count=1
(while true; do dd if=test.dd bs=1023 skip=1 2> /dev/null | dd bs=32768 count=1 
 2>/dev/null|wc -c; done) | uniq

What I think is happening is due to the buffering
in the pipes in the kernel (between the 2 dd processes).
The second dd process does a read(stdin,buf,32768),
but all that data may not be available to the second
process in the pipe buffer for many reasons.

dd does not issue another read() request to fill the input buffer,
before proceeding with the write(). I'm not sure why it does this.

Pádraig.


_______________________________________________
Bug-coreutils mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/bug-coreutils

Reply via email to