Não há uma boa maneira de fazer o que você quer fazer.
Como você observou, se você permitir que o registrador continue sua saída enquanto o interpretador de comandos estiver ecoando a digitação do usuário, você terá uma confusão confusa.
O outro lado é o seguinte: se você bloquear o registrador quando o usuário começar a digitar, corre o risco de bloquear uma mensagem IMPORTANTE, que requer ação IMEDIATA.
A melhor resposta é ter dois (2) "consoles", exibidos simultaneamente, para que você não tenha que bloquear seu registrador.
Se você não puder fazer isso, porque (por exemplo), você está em uma porta serial bruta, a segunda opção é adicionar prioridades às suas mensagens de saída. Quando o usuário começa a digitar, as mensagens não importantes são mantidas até que ele termine de digitar. Mensagens importantes são transmitidas e, em seguida, o interpretador de comandos retypes sua linha até agora. Isso exigirá uma certa quantidade de espaço no buffer para empilhar suas mensagens enquanto ele está coçando a cabeça.
PESSOALMENTE, se eu fosse fazer algo assim, colocaria um tempo limite nas mensagens retidas: se ele não terminar de digitar seu comando em algum tempo, as mensagens sem importância anteriormente armazenadas serão descartadas e, em seguida, a linha de comando até agora é digitada novamente.
Normalmente, não vale a pena evitar a mistura de mensagens. Se você tiver um operador detalhado e um registrador de mensagens detalhado, você terá problemas maiores do que apenas fluxos de saída mistos.