

何かしたいわけではないのですが、原因がわからないので、玄人の方にお聞きしたいです。

[code]

    $ top -b
    
[/code]

を Ctrl + Z で停止し、

[code]

    fg %1(jobID)
    
[/code]

で再開しようとすると、所望の動作をしません。  
画面が崩れ気味ですし、何より Ctrl + C などの入力を受け付けなくなってしまいます。  
理由がわかる方、教えてください。


CC BY-SA 4.0
2022-04-13T11:05:18.390
88317
2022-10-26T06:08:04.040
2022-10-26T06:08:04.040
3060
52212
question
linux bash command-line
topコマンドをバッチモードで起動し、停止後、fgで再開することができない理由


top のソースファイルはたぶんここ <https://gitlab.com/procps-
ng/procps/-/blob/newlib/src/top/top.c>

* * *

問題の動作の理由は, 本来の topコマンドのターミナル制御を batch-modeでも行ってしまっている ため

#### 本来の topコマンドの大まかな流れ

  * [termios](https://linuxjm.osdn.jp/html/LDP_man-pages/man3/termios.3.html) の `tcgetattr` にて現在のターミナル属性の取得 (`Tty_original`)。  
終了時に元に戻すなどで利用

  * 端末 ECHO しないなど各種のターミナル属性の設定を行う (`Tty_raw`)。  
top 実行中に利用

  * 各種のシグナルハンドラー登録。  
この中には `Control`+`Z` の `SIGTSTP`, 再開時の `SIGCONT` も含まれる

  * シグナルハンドラー内では, `Tty_original` / `Tty_raw` を使い(タイミングに合わせ)ターミナル属性の設定を行う
  * top コマンド終了時は元のターミナル属性に戻す

ここまでは問題はなく  
問題の発生する原因は, batch-modeにあります

#### batch-mode

  * ターミナル属性のセットアップ関数 `whack_terminal(void)` で, batch-mode時は `Tty_original` / `Tty_raw` をセットアップしていない。本来使わないはずなのでそれ自体は問題ない はず
  * 各種のシグナルハンドラー登録は batch-modeの区別がなく, 登録される
  * このため `SIGTSTP` からの再開で, `Tty_raw` の情報からターミナル属性が設定される
  * `Tty_raw` 内容はセットアップされていない(全 NUL文字)ためキーが効かなくなる。  
そして LF (`'\n'`) の出力が 復帰無しになり, カーソル真下に移動のみ(のモード)になり画面が崩れる

* * *

問題の対処 … 以下が考えられるでしょう

  * batch-modeでは `Tty_raw` を現在のターミナル属性でセットアップする
  * もしくは, batch-modeではシグナルハンドラーを一部登録しないようにする
  * (逃げ) batch-mode使わない, または `Control`+`Z` 使わない


CC BY-SA 4.0
2022-10-25T13:12:10.753
91815
2022-10-25T13:12:10.753
43025
88317
answer