I doubt there is any real likelihood of the pipe filling - it'll surely have capacity for a block or more, O(kB), so won't "fill" unless we have insane amounts of signals happening.

I'm not sure I understand @jimis's  concern about  calling CheckFileChanges after a signal, though.
For one thing, we may have waited arbitrarily close below the intended full time-out before select() returned; waiting for next time round the loop means waiting (up to) two time-outs between checks for file changes; or potentially arbitrarily long if we're getting signals (that we've handled or ignored) just often enough to never time out.
For another, if we don't flush the pipe now, next time round the loop we'll return from select() immediately, so you'll come in here and check for file changes pretty much instantly anyway; so we may as well flush the pipe and do it now.