Non è un problema di Linux o di altri sistemi, semplicemente non c'è nessuna garanzia che fflush(stdin) faccia quello che ci si aspetta. Come descritto nello standard infatti:

If stream points to an output stream or an update stream in which the most recent
operation was not input, the fflush function causes any unwritten data for that stream
to be delivered to the host environment to be written to the file; otherwise, the behavior is
undefined.
l' "otherwise" ovviamente comprende anche il caso il cui il file stream sia lo stdin. Insomma la fflush() richiamata su stdin ha un comportamento indefinito ("undefined behavior"), ragione per la quale con alcuni compilatori può sortire l'effetto di rilasciare caratteri bufferizzati nello stream di input (di fatto similmente a quello che succede con quelli di output) mentre con altri può anche semplicemente non fare nulla. Per citare Peter van der Linden:

undefined — The behavior for something incorrect, on which the standard does not impose any requirements. Anything is allowed to happen, from nothing, to a warning message to program termination, to CPU meltdown, to launching nuclear missiles (assuming you have the correct hardware option installed).
quindi attenzione a non provocare guerre nucleari.