Please try your yes thing again with an actual blocking factor. Like:
yes | dd ibs=k obs=kxk |
dd bs=kxk count=10 of=out
If you have a POSIX dd on site, your results will be:
10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 0.127955 s, 81.9 MB/s
$ ls -l out
-rw-r--r-- 1 mikeserv mikeserv 10485760 Mar 23 17:37 out
You have to synchronize i/o w/ dd to handle non-seekable inputs. In other words, make pipe-buffers explicit and they cease to be a problem. That's what dd is for. I suggest you read through the POSIX spec on dd. Particularly important is that you learn the different implications of any declarations for [ioc]?bs=. Here's a snippet from the POSIX spec:
- ibs=- expr- Specify the input block size, in bytes, by expr(default is 512).
 
- Specify the input block size, in bytes, by 
- obs=- expr- Specify the output block size, in bytes, by expr(default is 512).
 
- Specify the output block size, in bytes, by 
- bs=- expr- Set both input and output block sizes to exprbytes, supersedingibs=andobs=. If no conversion other thansync,noerror, andnotruncis specified, each input block shall be copied to the output as a single block without aggregating short blocks.
 
- Set both input and output block sizes to 
You'll also find some of this explained better here.
 
                