7

Linux/Unix マシン上で getty/agetty/mgetty プログラムがどのような機能を持っているのか、私にはよくわかりません。次のようなものを使用して、tty でシェルを開始できます。

TTY = '/dev/tty3'

cpid = os.fork()
if cpid == 0:
    os.closerange(0, 4)
    sys.stdin = open(TTY, 'r')
    sys.stdout = open(TTY, 'w')
    sys.stderr = open(TTY, 'w')
    os.execv(('/bin/bash',), ('bash',))

..そして、tty3 に切り替えると、シェルが実行されますが、一部のキーストロークが無視されるか、シェルに送信されません。シェルは、TTY 設定が正しくないことを認識します。これは、bash が「tty を開けません。ジョブ制御が無効になっています」などのメッセージを表示するためです。

「termios」モジュールには、「tty」モジュールが使用する TTY の設定を変更する機能があることは知っていますが、TTY を正しく設定してシェルを開始する Python の例を見つけることができません。シンプルなものであるべきだと思いますが、どこを見ればいいのかわかりません。

*etty プログラムのソースを見ても役に立ちませんでした。C は私にはギリシャ語のように見えます :-/

多分私は正しい用語を探していないだけですか?過去に*ettyプログラムをPythonに置き換えた人がいて、共有したい説明がありますか?

私の基本的な質問を楽しませてくれてありがとう:)

4

2 に答える 2

5

不足していることが少なくとも 2 つあります。他にもある可能性があります。

setsid()まず、古い標準入力/標準出力を閉じた後、新しい TTY を開く前に、子プロセスを呼び出す必要があります。これにより、新しいプロセスが新しいセッションのリーダーになり、以前の制御端末から関連付けが解除されます (端末を閉じるだけでは十分ではありません)。これは、新しい tty を開くと、必要な制御端末になることを意味します。

TERM次に、新しい tty と一致するように環境変数を設定する必要があります。

于 2011-05-06T01:27:49.883 に答える
0

* tty *プログラムのソースを調べて、それらが何をするかを確認する必要があります。

私の推測では、それらは主に一連のioctlコマンドを発行して、端末をプログラムが通常期待するモード(ログインなど)に初期化します。ただし、一部のユーザーはユーザー名の入力を求められる場合もあります(パスワードではありません。ログインするとそれが行われます)。

于 2011-05-06T12:05:21.090 に答える