xterm で /dev/ptmx ファイルが開かれないのはなぜですか?

xterm で /dev/ptmx ファイルが開かれないのはなぜですか?

gnome-terminalファイル/dev/ptmxを開きます:

ここに画像の説明を入力してください

しかし、xtermまだ開いていません:

ここに画像の説明を入力してください

各ターミナル エミュレーターでファイルが開かれている必要があると思ったのですが/dev/ptmx、なぜ xterm では開かれないのでしょうか?


編集: これはls -ld "$(command -v xterm)"ステファン・シャゼラス):

ここに画像の説明を入力してください

答え1

Xterm は/dev/ptmx開いていますが、このようには表示されません。その理由は次のとおりです。

実行xterm権限にはS_ISGID(set-group-ID) ビットが設定されており、グループ所有ですutmp

このように設定されているので、 は およびにxtermエントリを追加でき(正確なパスはシステムによって異なる場合があります)、セッションがまたはの出力に表示されます。/var/run/utmp/var/log/wtmpwholast

これらの権限があれば、xtermが実行されると、それを実行するプロセスは効果的グループIDはグループのIDに変更されますutmp読むグループ ID は同じままです)。これにより、utmp/ wtmplogin レコードを書き込みモードで開く権限が与えられます。

Linux では、セキュリティ対策として、実ユーザー ID とは異なる実効ユーザー ID、または実グループ ID とは異なる実効グループ ID を持つプロセスの開いているファイルのみを一覧表示できます (このようなプロセスの場合、他のプロセスと比較して、権限があるrootことがわかります)。/proc/<pid>fddr-x------ root rootdr-x------ you your-group

そのためlsof、 を一般ユーザーとして実行している場合、そのプロセスの開いているファイルを一覧表示することはできません。としてxterm実行する必要があります。lsofroot

なぜそれが機能するのかについてはgnome-terminals、いくつかの可能性があります。

  • gnome-terminalログインレコードにエントリを追加しません(私のシステムではそうです)
  • gnome-terminal使用utempter ヘルパー(この場合は sgid であるものutmp) を使用してログイン レコードを追加します。これが私のシステムで が行うxtermことです。konsole
  • gnome-terminalutmpログイン レコードを更新した後 (実際にはxterm実行されません)、有効なユーザー ID を実際のユーザー ID にリセットします (一時的に特別なアクセスを放棄します)。

答え2

これは擬似端末マスターデバイスですリナックスただし、xterm は擬似端末を開くために POSIX 関数を使用するため、デバイスのオープンの詳細は隠されます。

擬似端末にはさまざまな設定がありますが、おそらくあなたのシステムではこの塊:

#elif defined(HAVE_POSIX_OPENPT) && defined(HAVE_PTSNAME) && defined(HAVE_GRANTPT_PTY_ISATTY)
    if ((*pty = posix_openpt(O_RDWR)) >= 0) {
    char *name = ptsname(*pty);
    if (name != 0) {
        strcpy(ttydev, name);
        result = 0;
    }
}

VTE(実際の端末エミュレータ:「gnome-terminal」はファサード)は同様のものを使用しています(出典: pty.cc)。

実際には継続する必要はない使用してマスターデバイスのファイル記述子。xtermは2つのプロセスとして実行され、用途そのファイル記述子を「親」プロセスで破棄します。「子」プロセス(ソースを参照)

xtermを実行すると、子プロセスシェルが通信するものです。例えば、tty使用している端末を確認するには(つまり、奴隷擬似端末の側、およびマスター各プロセスは擬似端末の片側のみで動作する必要があるため、擬似端末の両側は閉じられています。

親プロセス(open を持つ/dev/ptmx) は X ウィンドウの表示を管理します。

これらすべてを考慮すると、lsofshow xterm が/dev/ptmx開かれたことが表示されると予想されます。ただし、次の例外があります。

  • スクリーンショットでは、メッセージはあなたが実行していないことを示唆していますlsof、すべてのプロセスを表示できない権限の問題がある場合は、情報が欠落している可能性があります。
  • xterm は、実行しているマシン上で実際には実行されていません。たとえば、マシンに ssh で接続している場合 (そして、別のセッションで実行されているlsofのが見える場合)。gnome-terminal

関連情報