If the second program is messed up, it makes no difference if you flush or not. You'll still never see an error message.
Stdin will fill up, flush or not, the program will block, and then sit there - no error message.
You could maybe detect if stdin is blocked and say something on stderr - but if you want to do that it makes no difference whatsoever if you flush stdout or not.
You don't understand. Once stdout blocks the whole program blocks, so it makes no difference that stderr is not piped. The program is stopped, it won't be making any errors.
Obviously you could make some complicated buffering scheme - but you can do that and flush things anyway. The flush or no flush makes no difference.
You're picking nits frankly. The system can be useful. But it does deadlock and/or cause delays if your output program stops reading from the pipe temporarily or permanently. The deadlocked secondprogram was just a simple example of when this happens.
This sort of behavior is a rare case. It is far from rare though in a less degenerate form. In the very simple case of displaying text on the command line you will fill your output buffer all the time, but with the flushes, you'll vastly slow the program down to the speed of text display in your terminal as you make all text output every time, as opposed to just when the buffer display program runs.
Which do you think will run faster: Cat without those flushes or cat with those flushes?
This technique is not universally applicable, as the article says. It does not fit all cases. It has costs.
It does also have applications. But it's not the suggested universal technique.
You can do other things....like say, print out on stderr that there is a problem after a certain timeout, email technical support, or restart the second program.
If the second program is messed up, it makes no difference if you flush or not. You'll still never see an error message.
Stdin will fill up, flush or not, the program will block, and then sit there - no error message.
You could maybe detect if stdin is blocked and say something on stderr - but if you want to do that it makes no difference whatsoever if you flush stdout or not.