OK, the crucial point I missed was that you want to skip the check for file changes when the signal caught during select() is asking us to terminate; i.e. don't let this time-consuming check delay exit when it's asked for.
As long as there's no realistic way we'll get hit by a long run of turns round this loop, in each of which we get a signal during select, I can live with deferring the pipe-flush until next time round the loop.