標準愚痴出力

個人的なIT作業ログです。もしかしたら一般的に参考になることが書いているかもしれません(弱気

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 の内部実装を真似てやったんですが。見直しが必要かなぁ。

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