
答え1
Xterm は/dev/ptmx
開いていますが、このようには表示されません。その理由は次のとおりです。
実行xterm
権限にはS_ISGID
(set-group-ID) ビットが設定されており、グループ所有ですutmp
。
このように設定されているので、 は およびにxterm
エントリを追加でき(正確なパスはシステムによって異なる場合があります)、セッションがまたはの出力に表示されます。/var/run/utmp
/var/log/wtmp
who
last
これらの権限があれば、xterm
が実行されると、それを実行するプロセスは効果的グループIDはグループのIDに変更されますutmp
(読むグループ ID は同じままです)。これにより、utmp
/ wtmp
login レコードを書き込みモードで開く権限が与えられます。
Linux では、セキュリティ対策として、実ユーザー ID とは異なる実効ユーザー ID、または実グループ ID とは異なる実効グループ ID を持つプロセスの開いているファイルのみを一覧表示できます (このようなプロセスの場合、他のプロセスと比較して、権限があるroot
ことがわかります)。/proc/<pid>fd
dr-x------ root root
dr-x------ you your-group
そのためlsof
、 を一般ユーザーとして実行している場合、そのプロセスの開いているファイルを一覧表示することはできません。としてxterm
実行する必要があります。lsof
root
なぜそれが機能するのかについてはgnome-terminals
、いくつかの可能性があります。
gnome-terminal
ログインレコードにエントリを追加しません(私のシステムではそうです)gnome-terminal
使用utempter
ヘルパー(この場合は sgid であるものutmp
) を使用してログイン レコードを追加します。これが私のシステムで が行うxterm
ことです。konsole
gnome-terminal
utmp
ログイン レコードを更新した後 (実際には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 ウィンドウの表示を管理します。
これらすべてを考慮すると、lsof
show xterm が/dev/ptmx
開かれたことが表示されると予想されます。ただし、次の例外があります。
- スクリーンショットでは、メッセージはあなたが実行していないことを示唆しています根
lsof
、すべてのプロセスを表示できない権限の問題がある場合は、情報が欠落している可能性があります。 - xterm は、実行しているマシン上で実際には実行されていません。たとえば、マシンに ssh で接続している場合 (そして、別のセッションで実行されている
lsof
のが見える場合)。gnome-terminal