制御端末の実際の名前を取得するには?

制御端末の実際の名前を取得するには?

制御端末の実際の名前(存在する場合、そうでない場合はエラーが発生した場合)をパス名としてどのように取得しますか?

「本名」とは、他/dev/ttyの任意のプロセスがそれを使用して同じ端末を参照できるという意味ではありません。可能であれば、単純なシェルコード(以下の例のように)で答えを好み、そうでなければC関数で答えることを好みます。

これは、標準入力がリダイレクトされても機能する必要があるため、ttyユーティリティを使用できません。この場合、標準入力に接続されている端末のファイル名のみが印刷されるnot a ttyため、エラーが表示されます。tty

Linuxでは、次のものを使用できます。

echo "/dev/`ps -p $$ -o tty | tail -n 1`"

しかし、POSIXによると、これは移植性がありません。端末名の形式が指定されていません。

C関数の場合はctermid (NULL)returnを使用します/dev/tty。ここでは役に立ちません。

メモ:zsh文書によると、次のことができるはずです。

zsh -c 'echo $TTY'

ただし、現在(バージョン5.0.7)stdinとstdoutの両方がリダイレクトされると失敗します。

$ zsh -c 'echo $TTY > /dev/tty' < /dev/null
/dev/pts/9
$ zsh -c 'echo $TTY > /dev/tty' < /dev/null > /dev/null
/dev/tty

ベストアンサー1

「制御端末」とも呼ばれます。 cttyは「とは異なります。これプロセスが対話する端末です。」

cttyパスを取得する標準的な方法はctermid(3)です。このコマンドを呼び出した後、 バージョン10以降、freebsdは実際のパスを検索します。[1]、以前のfreebsdとglibcの実装[2] 無条件"/dev/tty"を返します。

Linux procps 3.2.8 パッケージの ps(1),/proc/*/stat の数値エントリを読む[3] ではパス名控除 部分的には推測で[4、5]によるシステムサポート不足[6]。

ただし、cttyだけに興味がなく、代わりにstdioに関連付けられている端末に興味がある場合、tty(1)はttyname(fileno(stdin))cと同じstdinに接続されている端末パスを印刷し、代わりにです readlink /proc/self/fd/0


無条件の「/dev/tty」の動作についてあまり重要ではない考え方:仕様では、単に「現在のパス」ではなく、「パス名として使用されたときに現在の制御端末を参照」するctermidによって返される文字列があると言います。名前は「control端末」です。 「/dev/tty」は、制御端末ではなく、同じプロセスが開かれたときにのみ制御端末を参照するものと解釈できるため(3)違反はありません。 「ターミナルは最大1つのセッションのCTYにすることができます。」ルール[7]。

別の結果は、制御端末がなくてもctermidが失敗しないことです。仕様では、これらのエラーを受け入れます。[8] - だから私は後続のopen(3)が失敗するまでctty'lessであることに気づいていません。これはまた、仕様にopen(3)呼び出しが成功を保証しないことを示しているので、大丈夫です。

おすすめ記事