NYAGOS保守ノート:more が Ctrl-C で死んでしまう

more が Ctrl-C で nyagos ごと死んでしまうという不具合です。これは常に発生しているわけではなくて、nyagos の中から nyagos を呼んで、その中の more を実行した時に限られます。

つまり、more を実行中の nyagos を殺しているのは、親プロセスの nyagos なんですよね。shell/interpreter.gostartAndWaitProcess() で外部プロセスの終了を待っている時に Contextのキャンセルをキャッチすると、終了を待っている子プロセスを kill するようになってます。

これを子プロセス側が拒否するには、コンソールのモードで ENABLE_PROCESS_INPUT ビットを0にします(SetConsoleMode)。実際 readline はそれで無効になっています。ならば more も同様に0にすればよさそうなもんなんですが…そうするとエコーもオフになるんですよね。一応、ENABLE_ECHO_INPUT というビットもあって、こちらを1にすると ENABLE_PROCESS_INPUTが0でもエコーしてくれるんですが…こちらだと CR がそのまま解釈されて、Enterキー入力しても復帰はしても改行してくれない(LFがないから)。まぁ、実害はないんですが、これはユーザから不具合報告が来そうな挙動です。うーん、コンソールのモードを触るのは間違いなんかなー。

ちなみに os.Signal 方面での禁止は効かないようです。まぁ、言ってみれば SIGKILL で殺されているわけですからね。うーん、やはりアプローチがいけないのかなぁ。"os/exec".Cmd.Wait の内部実装を真似てやったんですが。見直しが必要かなぁ。

というわけで、現在頓挫中です…はい