↑すまん、MONAのカーネルの仕組み良く知らんのだけど、
キーボード系などの資源は、タスク側に解放するのではなく、完全に隠蔽した
ほうがいいかと。キーボードの入力状況は、カーネル内の一箇所のみに蓄える。

std::deque< char > core_keybd_history;
と定義し、唯一のカーネルプロセスで
if( any_keybd_input == true )
{
core_keybd_history.push_front( km.getCharacter() )
}
という感じで蓄える。
で、km.getCharacter() とやらは、アプリ側には非公開。

で適切なタイミングで、カーネルが保持しているプロセス・デスクリプタに
historyを適切に集配する。
この適切なタイミングとは、そのプロセスに処理権利が移る瞬間かと。(本当にすまん、MONAについて何も知らないので他にもっと適切なタイミングがあるかも)
各プロセス・デスクリプタに以下のようなヒストリーバッファを用意。
std::deque< char > process_keybd_history;

アプリ側は盲目的に
process_keybd_history.end()で取り出し、不要になったら
process_keybd_history.pop_back()で実現かと。

物理的なキーボード状態が格納されてる唯一のバッファをcore_keybd_historyに絞り
あとは配布次第ってことで。