Linux TTY/PTS の違いの概要

Linux TTY/PTS の違いの概要

キーボードで文字を入力すると、対応するプロセスにどのように送信されるのでしょうか? ps や who などのコマンドで表示される tty1 や pts/0 などの出力の機能と違いは何ですか?

TTYの歴史

マルチタスクコンピュータが登場する以前

コンピュータが登場する前、人々はテレタイプと呼ばれる装置を使って互いにメッセージを送信していました。それは次のようでした:

+----------+ 物理ライン +----------+
| テレタイプ |<--------------------->| テレタイプ |
+----------+ +-----------+

2 台のテレタイプは有線で接続されており、その両端にモデムのような装置がある場合があります (ここでは無視します)。一方のテレタイプで入力すると、対応するデータがもう一方のテレタイプに送信されます。具体的な機能はわかりません。 (私の頭の中のイメージは、片側で入力し、もう片側で印刷するというものです)

これらは骨董品であり、私はそれらに出会ったことがないので、単純な推測しかできません。

マルチタスクをサポートするコンピュータの登場後

コンピュータがマルチタスクをサポートすると、人々はこれらのテレタイプをコンピュータに接続し、コンピュータを操作するためのコンピュータ端末として使用することを考えました。

テレタイプを使用する主な理由は 2 つあります (個人的な意見)。

  • 現実には、すでにさまざまなメーカーから多数のテレタイプが存在しており、既存のリソースを最大限に活用することができます。
  • テレタイプの関連ネットワークはすでにかなり成熟しており、接続も簡単です。

したがって、接続は次のように展開されます。

                                   +----------+ 
+----------+ +-------+ 物理ライン +-------+ +------+ | |
| ターミナル |<->| モデム |<--------------------->| モデム |<->| UART |<->| コンピュータ |
+----------+ +-------+ +-------+ +------+ | |
                                   +----------+
  • 左側の端末はさまざまなテレタイプです
  • モデムは、よく「cat」と呼ばれ、物理的な回線の両側で使用されています。これは、インターネットが徐々に発展し、誰もが接続を共有できるようになったためです。 (大まかな推測なので間違っているかもしれません)
  • UART は、テレタイプ信号をコンピューターが認識できる信号に変換するデバイスとして理解できます。

カーネル TTY サブシステム

これらのテレタイプをサポートするために、コンピューターは TTY と呼ばれるサブシステムを設計しました。その内部構造は次のとおりです。

  +-------------------------------------------------+
  | カーネル |
  | +--------+ |
  | +--------+ +-------------+ | | | +----------------+
  | | UART | | 回線 | | TTY |<---------->| ユーザープロセス A |
<------>| |<->| |<->| | | +----------------+
  | | ドライバー | | 規律 | | ドライバー |<---------->| ユーザープロセス B |
  | +--------+ +-------------+ | | | +----------------+
  | +--------+ |
  | |
  +-------------------------------------------------+
  • UARTドライバは外部UARTデバイスに接続します
  • ライン ディシプリンは主に入出力の処理を担当します。TTY ドライバーの一部であると理解できます。
  • TTYドライバはさまざまな端末デバイスを処理するために使用されます
  • ユーザー空間プロセスはTTYドライバを介して端末と対話する

簡潔にするために、以下の概要では UART ドライバーとライン ディシプリンを個別にリストしません。これらは TTY ドライバーの一部と見なすことができます。

TTYデバイス

TTY ドライバーは、各端末に対応する TTY デバイスを作成します。複数の端末が接続されている場合、次のようになります。

           +----------------+
           |TTY ドライバー |
           | |
           | +-------+ | +----------------+
 +------------+ | | |<---------->| ユーザープロセス A |
 | ターミナル A |<--------->| ttyS0 | | +----------------+
 +------------+ | | |<---------->| ユーザープロセス B |
           | +-------+ | +----------------+
           | |
           | +-------+ | +----------------+
 +------------+ | | |<---------->| ユーザープロセス C |
 | ターミナル B |<--------->| ttyS1 | | +----------------+
 +------------+ | | |<---------->| ユーザープロセス D |
           | +-------+ | +----------------+
           | |
           +----------------+

ドライバーは端末接続を受信すると、端末モデルとパラメータに基づいて対応する tty デバイスを作成します (ほとんどの端末はシリアル接続で接続されているため、上図のデバイス名は ttyS0 です)。端末はそれぞれ異なり、独自の特殊コマンドと使用習慣があるため、各 tty デバイスの構成は異なる場合があります。たとえば、Delete キーを押すと、前の文字を削除するキーもあれば、次の文字を削除するキーもあります。正しく設定されていないと、一部のキーは期待どおりに動作しません。アナログ端末を使用するときに、デフォルトの設定が習慣に合わない場合は、パーソナライズされた設定を行う必要があるのはそのためです。

その後、コンピュータの継続的な発展に伴い、テレタイプ デバイスは徐々に姿を消しました。特別な端末デバイスは不要になりました。各マシンには独自のキーボードとモニターがあり、各マシンは他のマシンの端末になることができました。リモート操作は ssh を介して実現されましたが、カーネル TTY ドライバー アーキテクチャは変更されませんでした。システム内のプロセスと I/O 対話を実行する場合は、依然として TTY デバイスを使用する必要がありました。その結果、さまざまな端末エミュレーション ソフトウェアが登場し、VT100、VT220、XTerm などのいくつかの一般的な端末もシミュレートしました。

  • toe -a コマンドを使用すると、システムでサポートされているすべての端末タイプを一覧表示できます。
  • infocmp コマンドを使用して、2 つの端末間の違いを比較できます。たとえば、infocmp vt100 vt220 は、vt100 と vt220 の違いを出力します。

プログラムがTTYと対話する方法

TTY デバイスの作成方法と構成方法について説明する前に、まずプロセスによる TTY の使用方法を見てみましょう。

#まずttyコマンドを使用して、現在のbashがどのttyに関連付けられているかを確認します
dev@debian:~$ tty
/dev/pts/1

#どのプロセスが tty を開いているか確認する dev@debian:~$ lsof /dev/pts/1
コマンド PID ユーザー FD タイプ デバイス サイズ/オフ ノード名
bash 907 dev 0u CHR 136,1 0t0 4 /dev/pts/1
bash 907 dev 1u CHR 136,1 0t0 4 /dev/pts/1
bash 907 dev 2u CHR 136,1 0t0 4 /dev/pts/1
bash 907 dev 255u CHR 136,1 0t0 4 /dev/pts/1
lsof 1118 dev 0u CHR 136,1 0t0 4 /dev/pts/1
lsof 1118 dev 1u CHR 136,1 0t0 4 /dev/pts/1
lsof 1118 dev 2u CHR 136,1 0t0 4 /dev/pts/1

#データを直接 tty に書き込むと、標準出力に書き込むのと同じ効果があります dev@dev:~$ echo aaa > /dev/pts/2
ああ

PTS も tty デバイスです。これらの関係については後で説明します。

上記の lsof から、現在実行中の bash および lsof プロセスの stdin(0u)、stdout(1u)、および stderr(2u) がすべてこの TTY にバインドされていることがわかります。

以下は、tty、プロセス、および I/O デバイス間の相互作用を示す図です。

  入力 +--------------------------+ R/W +------+
----------->| |<---------->| バッシュ |
      | ポイント/1 | +-----+
<-----------| |<----------->| lsof |
  出力 | フォアグラウンドプロセスグループ | R/W +------+
      +--------------------------+                
  • tty はパイプと考えることができます。一方の端に書き込まれた内容はもう一方の端から読み取ることができ、その逆も同様です。
  • ここでの入力と出力は、単純にキーボードとディスプレイとして理解できます。後ほど、さまざまな状況で入力/出力が何に接続されるかを紹介します。
  • tty には、フォアグラウンド プロセス グループと呼ばれる非常に重要な属性があり、これは現在のフロントエンド プロセス グループを記録します。プロセス グループの概念については、次の記事で紹介します。ここでは、プロセス グループにはプロセスが 1 つだけあると仮定します。
  • pts/1 は入力を受け取ると、現在のフロントエンド プロセス グループがどれであるかを確認し、その入力をプロセス グループのリーダーの入力バッファーに格納します。これにより、対応するリーダー プロセスは、読み取り関数を通じてユーザーの入力を取得できます。
  • フロントエンドプロセスグループのプロセスがttyデバイスにデータを書き込むと、ttyはデータを出力デバイスに出力します。
  • シェルでさまざまなコマンドを実行すると、フロントエンド プロセス グループが常に変化し、シェルはこの変更を tty デバイスに更新する役割を担います。

上記からわかるように、プロセスと tty の扱いは非常に簡単です。バックグラウンド プロセスが tty を読み書きしないようにするだけです。つまり、バックグラウンド プログラムを作成するときは、stdin/stdout/stderr を他の場所にリダイレクトする必要があります (もちろん、デーモン プログラムも他の多くの処理を実行する必要があります)。

まず、2 つの質問をさせてください (回答は後ほど)。

  • フロントエンド以外のプロセス グループ (バックグラウンド プロセス) 内のプロセスが tty デバイスにデータを書き込むと何が起こりますか? outpuに出力されますか?
  • 非フォアグラウンド プロセス グループ (バックグラウンド プロセス) 内のプロセスが tty デバイスからデータを読み取ると何が起こりますか?プロセスはブロックされますか?

TTY の誕生

以下では、いくつかの一般的な状況で tty デバイスがどのように作成されるか、また入力デバイスと出力デバイスとは何かについて説明します。

キーボードディスプレイ直接接続(端末)

話す前に写真を見てください:

          +-----------------------------------------+
          | カーネル |
          | +--------+ | +----------------+ 
 +----------+ | +-------------------+ | tty1 |<---------->| ユーザープロセス |
 | キーボード |--------->| | +--------+ | +----------------+
 +----------+ | | 端末エミュレータ |<->| tty2 |<---------->| ユーザープロセス |
 | モニター |<---------| | +--------+ | +----------------+
 +----------+ | +-------------------+ | tty3 |<---------->| ユーザープロセス |
          | +--------+ | +----------------+
          | |
          +-----------------------------------------+

キーボードとモニターはカーネル内のターミナル エミュレータに接続されます。エミュレータは作成する tty の数を決定します。たとえば、キーボードで ctrl+alt+F1 を入力すると、エミュレータは最初に入力をキャプチャし、次に tty1 をアクティブにします。キーボード入力は tty1 に転送され、tty1 の出力はモニターに転送されます。同様に、ctrl+alt+F2 を入力すると、tty2 に切り替わります。

シミュレータが tty をアクティブ化したときに、それに関連付けられたプロセスがないことがわかった場合、これは tty が初めて開かれることを意味するため、設定されたプロセスを開始し、それを tty にバインドします。通常、このプロセスはログインを担当するプロセスです。

tty2 に切り替えると、tty1 の出力はどこに出力されますか? tty1 の出力は引き続きエミュレータに出力され、エミュレータには各 tty のキャッシュが存在します。ただし、エミュレータのキャッシュ スペースが限られているため、次に tty1 に戻ったときには最新の出力しか表示されず、以前の出力は表示されなくなります。

ターミナル エミュレータがカーネル内のどのモジュールに対応しているかはわかりませんが、確かに存在します。

SSH リモート アクセス

 +----------+ +-------------+
 | キーボード |------>| |
 +----------+ | ターミナル |
 | モニター |<------| |
 +----------+ +-------------+
             |
             | ssh プロトコル
             |
             ↓
          +------------+
          | |
          | ssh サーバー |--------------------------+
          | | フォーク |
          +------------+ |
            | ↑ |
            | | |
         書く | | 読む |
            | | |
         +-----|---|-------------------+ |
         | | | | ↓
         | ↓ | +-------+ | +-------+
         | +--------+ | pts/0 |<---------->| シェル |
         | | | +-------+ | +-------+
         | | ptmx |<->| pts/1 |<---------->| シェル |
         | | | +-------+ | +-------+
         | +--------+ | pts/2 |<---------->| シェル |
         | +-------+ | +-------+
         | カーネル |
         +-----------------------------+

ここでのターミナルは、Windows の putty など、どこにでもあるプログラムである可能性があるため、クライアントのターミナル プログラムがキーボードやディスプレイとどのように対話するかについては説明しません。ターミナルは ssh サーバーと対話する必要があるため、ssh クライアント機能を実装する必要があります。

ここでは、接続の確立とデータの送受信を 2 行で説明します。簡単にするために、ssh サーバー プログラムの代わりに sshd を使用します。

接続を確立する

1.ターミナルはsshdとの接続を確立するよう要求する

2. 検証が成功すると、sshdは新しいセッションを作成します。

3. API (posix_openpt()) を呼び出して、ptmx に pts の作成を要求します。作成が成功すると、sshd は ptmx に関連付けられた fd を取得し、その fd をセッションに関連付けます。

#pty (擬似端末デバイス) は 2 つの部分で構成され、ptmx はマスター側、pts はスレーブ側です。
#プロセスは API を呼び出して ptmx に pts の作成を要求でき、その後、ptmx に接続された読み取り/書き込み fd と新しく作成された pts を取得します。
#ptmx は fd と pts 間の対応を内部的に維持し、この fd への読み取りおよび書き込み操作は ptmx によって対応する pts に転送されます。

#ここで、sshdが/dev/ptmxを開いていることがわかります
dev@debian:~$ sudo lsof /dev/ptmx
コマンド PID ユーザー FD タイプ デバイス サイズ/オフ ノード名
sshd 1191 dev 8u CHR 5,2 0t0 6531 /dev/ptmx
sshd 1191 dev 10u CHR 5,2 0t0 6531 /dev/ptmx
sshd 1191 dev 11u CHR 5,2 0t0 6531 /dev/ptmx

4. 同時に、sshdはシェルプロセスを作成し、新しく作成されたptsをシェルにバインドします。

メッセージを送受信する

1.ターミナルはキーボード入力を受け取り、sshプロトコル経由でsshdにデータを送信します。

2. sshdはクライアントからデータを受信した後、管理しているセッションに応じて、クライアントに対応するptmxに関連付けられたfdを見つけます。

3. クライアントから送信されたデータを、見つかったfdに書き込む

4. ptmxはデータを受信した後、fdに従って対応するptsを見つけ(対応関係はptmxによって自動的に維持されます)、データパケットを対応するptsに転送します。

5. データパケットを受信した後、ptsは現在バインドされているフロントエンドプロセスグループをチェックし、データパケットをプロセスグループのリーダーに送信します。

6. ptsにはシェルしかないので、シェルの読み取り関数はデータパケットを受信する。

7. シェルは受信したデータパケットを処理し、処理結果を出力します(出力がない場合もあります)。

8. シェルはwrite関数を通じて結果をptsに書き込みます。

9.ptsは結果をptmxに転送します

10.ptmxはptsに応じて対応するfdを見つけ、その結果をfdに書き込みます。

11. sshdはfdの結果を受け取った後、対応するセッションを見つけ、その結果を対応するクライアントに送信します。

キーボードとディスプレイの直接接続(グラフィカルインターフェイス)

 +----------+ +-------------+
 | キーボード |------>| |
 +----------+ | ターミナル |--------------------------+
 | モニター |<------| | フォーク |
 +----------+ +-------------+ |
            | ↑ |
            | | |
         書く | | 読む |
            | | |
         +-----|---|-------------------+ |
         | | | | ↓
         | ↓ | +-------+ | +-------+
         | +--------+ | pts/0 |<---------->| シェル |
         | | | +-------+ | +-------+
         | | ptmx |<->| pts/1 |<---------->| シェル |
         | | | +-------+ | +-------+
         | +--------+ | pts/2 |<---------->| シェル |
         | +-------+ | +-------+
         | カーネル |
         +-----------------------------+

簡潔にするために、この記事では、Linux のグラフィカル インターフェイスのターミナル プログラムがキーボードやディスプレイとどのように対話するかについては説明しません。

ここでと上記の違いは、ここでのターミナルは ssh クライアントを実装する必要がないが、ssh サーバーが実行する必要がある作業 (もちろん ssh 通信関連の作業は除く) を実行する必要があることです。

SSH + スクリーン/Tmux

Linux を頻繁に使用する学生であれば、screen と tmux に精通しているはずです。これらによって開始されたプロセスは、ネットワークが切断されても実行され続けます。次に接続したときには、プロセスの出力をすべて確認して作業を続行できます。

ここでは tmux を例にその原理を紹介します。

 +----------+ +-------------+
 | キーボード |------>| |
 +----------+ | ターミナル |
 | モニター |<------| |
 +----------+ +-------------+
             |
             | ssh プロトコル
             |
             ↓
          +------------+
          | |
          | ssh サーバー |--------------------------+
          | | フォーク |
          +------------+ |
            | ↑ |
            | | |
         書く | | 読む |
            | | |
         +-----|---|-------------------+ |
         | ↓ | | ↓
         | +--------+ +-------+ | +-------+ フォーク +-------------+
         | | ptmx |<->| pts/0 |<---------->| シェル |-------->| tmux クライアント |
         | +--------+ +-------+ | +-------+ +------------+
         | | | | ↑
         | +--------+ +-------+ | +-------+ |
         | | ptmx |<->| pts/2 |<---------->| シェル | |
         | +--------+ +-------+ | +-------+ |
         | ↑ | カーネル | ↑ |
         +-----|---|-------------------+ | |
            | | | |
            |w/r| +----------------------------+ |
            | | | フォーク |
            | ↓ | |
          +-------------+ |
          | | |
          | tmux サーバー |<--------------------------------------------+
          | |
          +-------------+

システムには ptmx が 1 つしかありませんが、上の図では 2 つが描かれており、tmux サーバーと sshd の両方が ptmx を使用しながらも、互いに干渉しないことを示しています。

この状況は少し複雑ですが、原理は同じです。前半は通常の ssh 方式と同じですが、pts/0 に関連付けられたフロントエンド プロセスはシェルではなく、tmux クライアントです。したがって、ssh クライアントによって送信されたデータ パケットは tmux クライアントによって受信され、その後 tmux クライアントによって tmux サーバーに転送されます。tmux サーバーによって行われる作業は、ssh の作業に似ています。また、一連のセッションを維持し、各セッションの pts を作成し、tmux クライアントによって送信されたデータを対応する pts に転送します。

tmux サーバーは tmux クライアントのみを扱い、sshd とは関係がないため、ターミナルと sshd の接続が切断されると、pts/0 は閉じられ、それに関連するシェルと tmux クライアントも強制終了されますが、tmux サーバーには影響しません。次回 tmux クライアントを使用して tmux サーバーに接続すると、最後の内容が表示されます。

TTYとPTSの違い

上記のプロセスから、ユーザー空間プログラムの場合、それらの間に違いはなく、すべて同じであることが明らかです。カーネルの観点から見ると、pts のもう一方の端は ptmx に接続され、tty のもう一方の端はカーネルの端末エミュレータに接続され、ptmx と端末エミュレータは両方ともセッションの維持とデータ パケットの転送のみを担当します。ptmx のもう一方の端とカーネル端末エミュレータを見ると、ptmx のもう一方の端は sshd、tmux などのユーザー空間アプリケーションに接続され、カーネル端末エミュレータのもう一方の端はキーボードやモニターなどの特定のハードウェアに接続されています。

一般的なTTY構成

まず、現在の tty のすべての構成を見てみましょう。

dev@dev:~$ stty -a
速度 38400 ボー; 行 51; 列 204; 行 = 0;
intr = ^C; quit = ^\; erasing = ^?; kill = ^U; eof = ^D; eol = M-^?; eol2 = M-^?; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; discard = ^O; min = 1; time = 0;
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc ixany imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke -flusho -extproc

sttyはttyパラメータを変更するためにも使用できます。使用方法についてはman sttyを参照してください。

権限を持つプログラムは、Linux が提供する API を通じて TTY 構成を変更できます。次に、一般的な構成項目をいくつか示します。

行 51; 列 204;

この設定は、通常、端末によって制御されます。端末のウィンドウ サイズが変更された場合、特定の方法で設定を変更する必要があります。たとえば、ssh プロトコルにはウィンドウ サイズを変更するためのパラメーターがあります。sshd はクライアントの要求を受信すると、API を介して tty のこのパラメーターを変更し、次に tty は SIGWINCH 信号を介してフロントエンド プログラム (シェルや vim など) に通知します。信号を受信したフロントエンド プログラムは、tty のこのパラメーターを読み取り、出力フォーマットを調整する方法を認識します。

先頭 = ^C

tty は、端末とフロントエンド プロセス間でデータを転送するだけでなく、多くの制御コマンドもサポートしています。たとえば、端末で CTRL+C を入力すると、tty は入力文字列をフロントエンド プロセスに転送するのではなく、それをシグナル SIGINT に変換してフロントエンド プロセスに送信します。これは、制御コマンドに対応する入力の組み合わせを構成するために使用されます。たとえば、CTRL+C を CTRL+E に置き換えるには、「intr = ^E」を構成することができます。

開始 = ^Q; 停止 = ^S;

これらは、おそらく多くの人が頻繁に遭遇する 2 つの特殊な制御コマンドです。キーボードで誤って CTRL+S を入力すると、ターミナルが応答しなくなり、出力も入力への応答もなくなります。これは、このコマンドが TTY にすべての読み取りおよび書き込み操作を一時停止してブロックするように指示するためです。つまり、データは転送されず、CTRL+Q を押した後にのみ続行されます。この機能は歴史的遺産であるはずです。以前は、端末とサーバーの間にフロー制御機能がなかったため、サーバーがデータを送信しすぎて端末が処理できない可能性がありました。そのため、サーバーにそれ以上データを送信しないように指示し、端末が処理した後でサーバーに続行するように通知するために、このようなコマンドが必要でした。

このコマンドの一般的なシナリオは、tail -f コマンドを使用してログ ファイルの内容を監視することです。いつでも CTRL+S を押して画面の更新を停止し、読み取り後に CTRL+Q を押して更新を続行できます。それ以外の場合は、まず CTRL+C を押して終了し、読み取り後に tail -f コマンドを再実行する必要があります。

エコー

端末に文字を入力すると、入力した文字が時間どおりに表示される理由は、TTY が端末から送信された文字を受信した後、最初に元のパスで文字のコピーを返し、次にフロントエンド プロセスに渡して処理するため、端末は入力された文字を時間どおりに表示できるためです。 echo は、この機能を制御するために使用される設定項目です。-echo の場合は、echo 機能を無効にすることを意味します。

-停止する

シェルでプログラムを実行するときに、./myapp & のように最後に & を追加すると、myapp プロセスはバックグラウンドで実行されますが、プロセスが tty にデータを書き込み続けるとどうなるでしょうか。このパラメータは、出力を端末に転送するかどうか、つまり、結果を端末に表示するかどうかを制御するために使用します。ここで、「-tostop」は、出力が端末に送信されることを意味します。「tostop」として構成されている場合、端末には出力されず、tty はシグナル SIGTTOU を myapp に送信します。このシグナルのデフォルトの動作は、myapp の実行を一時停止することです。

TTY関連信号

上記の構成で説明した SIGINT、SIGTTOU、SIGWINCHU に加えて、TTY 関連のシグナルがいくつかあります。

署名

バックグラウンド プロセスが tty を読み取ると、tty はこのシグナルを対応するプロセス グループに送信します。デフォルトの動作では、プロセス グループ内のプロセスの実行が一時停止されます。中断されたプロセスを続行するにはどうすればよいですか?次の記事のSIGCONTを参照してください。

SIGHUP

たとえば、tty のもう一方の端がハングアップすると、ssh セッションが切断され、sshd は ptmx に関連付けられた fd を閉じ、カーネルは tty に関連するすべてのプロセスに SIGHUP シグナルを送信します。シグナルを受信した後のプロセスのデフォルトの動作は、プロセスを終了することです。

シグナルTP

ターミナルで CTRL+Z を入力すると、tty はそれを受信した後、フロントエンド プロセス グループに SIGTSTP を送信します。デフォルトの動作では、フロントエンド プロセス グループをバックエンドに配置し、プロセス グループ内のすべてのプロセスの実行を一時停止します。

すべてのtty関連シグナルをキャプチャでき、そのデフォルトの動作を変更できます。

結論

この記事では、tty の一般的な機能と特徴を紹介します。次の記事では、tty と関係の深いプロセス セッション ID、プロセス グループ、ジョブ、バックグラウンド プログラムなどについて詳しく紹介します。お楽しみに。

参照する

TTYの謎を解く

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Linux の基礎: ターミナル、コンソール、tty、pty の紹介
  • Linux VPS とサーバーのより安全な設定 Putty SSH でキーログインを使用する
  • Linuxシステムでのwettyのインストールと使用法の簡単な分析
  • Putty を使用してリモート Linux ホストに自動的にログインする方法
  • Putty を使用した Linux VPS のリモート (SSH) 管理に関するグラフィック チュートリアル

<<:  Vue.$set の失敗の落とし穴の発見と解決

>>:  MYSQLでプロシージャの名前を変更する方法の詳細な説明

推薦する

CentOS 7 でゲートウェイを変更して IP を設定する方法の例

Centos7 バージョンをインストールするときに、外部ネットワークへの接続を選択すると、外部ネット...

ReactHooks バッチ更新状態とルートパラメータの取得例の分析

目次1. 一括更新の方法コンソール出力2. フックがルーティングパラメータを取得する方法実行効果1....

HTML ドキュメントに CSS を埋め込む一般的な 3 つの方法

HTMLでCSSを定義するには、埋め込み、リンク、インラインの3つの方法が一般的に使用されます。 1...

Windows 10 システムで Mysql8.0.13 のルート パスワードを忘れる方法

1. まずmysqlサービスを停止します管理者としてCMDを開いて閉じるか、Windowsサービスペ...

VMware Workstation のインストール (Linux カーネル) Kylin グラフィック チュートリアル

この記事では、VMware WorkstationにKylinをインストールする方法を参考までに紹介...

位置固定オフセット問題を解決する方法の詳細な説明

質問CSS 固定配置の position:fixed は非常に使いやすいです。ブラウザのビューポート...

WeChatアプレットは画像コントロールを選択します

この記事の例では、WeChatアプレットで画像コントロールを選択するための具体的なコードを参考までに...

Java は Excel から MySQL にデータをインポートします

実際の業務では、Excel からデータベースにデータをインポートする必要がある場合があります。データ...

jsを使用してシンプルな弾幕スクリーンシステムを実装する

この記事では、弾幕効果を実現するためのネイティブjsの具体的なコードを参考までに共有します。具体的な...

モバイルウェブページのサイズ調整を実装する方法

ようやく手元のプロジェクトが終了し、行方不明だった人たちが戻ってきました!プロジェクトを進める過程で...

ウェブデザインにおけるポップアップウィンドウとフローティングレイヤーのデザイン

従来のソフトウェアから Web ウェアへの段階的な移行の傾向の中で、デザイン パターンとテクノロジは...

Vue3とTypeScriptを組み合わせたプロジェクト開発の実践記録

目次概要1. コンポジションAPI 1. ref と reactive の違いは何ですか? 2. 周...

React+TypeScriptプロジェクト構築事例解説

React プロジェクトの構築は非常に簡単ですが、Typescript と組み合わせると、実際にはそ...

MySql エラー 1698 (28000) の解決策

1. 問題の説明: MysqlERROR1698 (28000) の解決方法、新しくインストールされ...

MySQL で期限切れのデータレコードを定期的に削除する簡単な方法

1. MySQL に接続してログインしたら、まず MySQL でイベント機能が有効になっているかどう...