追加読書

追加読書

擬似端末の主要部分を開いた後

int fd_pseudo_term_master = open("/dev/ptmx",O_RDWR);

擬似端末の一部を/dev/pts/[NUMBER]表すファイルが生成されます。slave

私のような無知な人は、完了したらptsname(fd_pseudo_term_master,filename_pseudo_term_slave,buflen);次に設定する必要があると思うかもしれません。単に 仕事をしてint fd_pseudo_term_slave = open(filename_pseudo_term_slave,O_RDWR);良い仕事をしてください。

ただし、疑似端末スレーブを「ロック」するために非常に重要なユースケースが必要です。作業を単純にするには、open次のものを使用する必要があるからです。男3ロック解除、「ロック解除」。

これの目的が何であるかわかりませんか?疑似端末の初期ロックの必要性は何ですか?コードは何を達成しますか(libcから取得)

/* Unlock the slave pseudo terminal associated with the master pseudo
   terminal specified by FD.  */
int
unlockpt (int fd)
{
#ifdef TIOCSPTLCK
  int save_errno = errno;
  int unlock = 0;

  if (ioctl (fd, TIOCSPTLCK, &unlock))
    {
      if (errno == EINVAL)
        {
          errno = save_errno;
          return 0;
        }
      else
        return -1;
    }
#endif
  /* If we have no TIOCSPTLCK ioctl, all slave pseudo terminals are
     unlocked by default.  */
  return 0;
}

可能であれば、回答には過去または現在のユースケースが詳細に記載されています。

質問の追加部分は次のとおりです。

現在、Linuxカーネルはまだ「疑似ターミナルスレーブロック」機能に依存していますか?

思考:これはレースの衝突を避けるための非効率的な試みですか?

答えを待っている間、Linuxカーネルのソースコードをもっと詳しく見ましたが、良い答えは得られませんでした。ただし、疑似端末の初期ロック状況で「抽出」されたように見える1つの使用は、特定のユーザーが/dev/pts/[NUMBER]最初にファイルにアクセスするのを防ぐために、ファイルへの特定のアクセス権を設定する時間を疑似端末の基本プロセスに提供することです。 。 。これは答えの一部かもしれませんか?しかし、奇妙なことは、この「初期ロック」状態が依存ファイルの複数のオープンを実際に妨げることはできないようです。少なくとも私の考えは原子性を確保するためです。

答え1

従来のAT&Tシステム5擬似ターミナルスレーブデバイス機構は普通である持続性以下の文字デバイスノード/dev。マルチプレクサがある所有者デバイスはにあります/dev/ptmx。以前の4.3BSD擬似端末装置機構には、一般端末装置の並列対がありました。持続性以下のマスターおよびスレーブデバイスノードです/dev

どちらの場合も、これはファイル記述子が最後に閉じられてからスレーブファイルが最後の所有権と権限を保持することを意味します。その結果、grantpt()擬似端末を使用して(再)割り当て(再)割り当て(再)した後、スレーブデバイスファイルの所有権と権限を変更する機能が進化し続けています.

open()これは、プログラムが間に再使用された疑似端末を設定するときに、grantpt()スレーブデバイスを事前に所有している人が密かに入って開いて、他の人の端末に潜在的にアクセスできるウィンドウがあることを意味します。したがって、疑似ターミナルスレーブキャラクタデバイスのアイデアは、開けられないロック状態から始まり、成功した実行後にロックを解除することですunlockpt()grantpt()

長年にわたり、これは不要であることが証明されています。

今日、スレーブデバイスファイルはカーネルが自分で作成して破壊するため、永続性はありません/dev。マスターを開く行為は、スレーブ権限と所有権をリセットするか、スレーブファイルを完全に再生成します(後者の場合、開いているすべてのファイル記述子が閉じられるとスレーブファイルは再び消えます)。どちらの場合も、同じシステムコールをアトミックに実行します。 。

  • PTMGETOpenBSDでは、これはデバイスのI / O制御機能の一部です/dev/ptm/devそれでもディスクボリュームであるカーネルは内部で関連する呼び出しを実行し、そこに新しいデバイスノードを作成し、所有権と権限をリセットします。
  • FreeBSDでは、posix_openpt()システムコールを介してこれが行われます。 /devCDボリュームはまったくありません。ファイルシステムですdevfs。これは開かれたファイル記述子をposix_openpt()ラップするのではなく、完全なシステムコールであるため、「マルチプレクサ」デバイスやプライマリデバイスファイルは含まれません。ioctl()スレーブデバイスは、対応するディレクトリのdevfspts/のファイルシステムに表示されます。

したがって、カーネルは最初から正しい権限と所有権を持つことを保証し、古い権限と所有権を持つ可能性はありません。したがってgrantpt()unlockpt()ライブラリ関数は本質的には機能しません。残りの機能は、渡されたファイル記述子を確認し、疑似端末の基本的なEINVAL側面ではない場合に設定することです。非擬似端末端末 - これらの機能の端末ファイル記述子であり、エラーを返すことが期待されます。

しばらくの間、Linuxでは、疑似端末スレーブデバイスが永続デバイスノードでした。 GNU Cライブラリgrantpt()はシステムコールではありません。代わりにset-UIDというヘルパーをフォークして実行しますpt_chownUID実行可能ファイルセットはありません。群衆。 (grantpt()権限のないユーザーが所有していない特別なデバイスファイルの所有権と権限を変更できるようにする必要があることに注意してください。)したがって、依然として機会のウィンドウがあり、Linuxは依然として維持されなければなりませんunlockpt()

「新しい」devptsファイルシステム(ここで「新しい」は数年前に導入され、今導入されたことを意味します)ほぼただし、FreeBSDと同じ方法で操作が許可されますdevfs。いくつかの違いがあります。

  • 「マルチプレクサ」デバイスもあります。
    • 内部に年をとる自動生成/破棄されたスレーブデバイスファイルのみを含む他のファイルシステムのデバイスである「新しい」devptsシステム。慣例通り、設定にはマウントが用意されています。ptmxdevtmpfsdevpts/dev/ptmxdevpts/dev/pts
    • しかし、Linuxの人々は欲しいです。複数の完全独立コンテナなどに使用されるファイルシステムインスタンスdevpts。存在する場合、両方のファイルシステムを(正しく)同期することは非常に困難です。たくさん devtmpfsそしてdevptsファイルシステム。だから最新「新しい」devptsシステムのすべてのデバイス(マルチプレクサとスレーブ)は同じファイルシステムにあります。以前のバージョンとの互換性のためにptmx新しいptmxmodeマウントオプションを設定しないと、デフォルトでは新しいノードにアクセスできません。
    • 内部にも更新されました「新しい」ファイルシステムのデバイスファイルはdevpts現在、デフォルトのマルチプレクサであり、シンボリックリンク、バインドマウント、または一般的な既存のデバイスをエミュレートしようとするカーネルによって提供されるシムです。ptmxdevptsptmxdevtmpfs実際へのシンボリックリンクですpts/ptmx
  • カーネルは常に所有権と権限を希望する方法で設定するわけではありませんgrantpt()。無効なマウントオプション(GIDgid以外のオプションttyまたはmode0620以外のオプション)を設定すると、GNU Cライブラリで代替アクションがトリガーされます。grantpt()必要に応じて、GNU Cライブラリのランダム化(no-ops)を減らすには、カーネルは次のことを行う必要があります。いいえオープンプロセスのグループを割り当てるには(つまり、明示的な設定が必要ですgid)、割り当てられたグループはグループでなければならず、tty新しくmode作成されたスレーブデバイスのグループは正確に0620でなければなりません。

デフォルトではオンになっておらず、カーネルとCライブラリが同期していないため、/dev/pts/ptmxGNU Cライブラリは完全にランダムに縮小されません。grantpt()各人は他の人の以前のバージョンで作業する必要があります。 Linuxはまだ古いGNU Cライブラリを提供する必要があります。これは、正しいインストールオプションを持つ新しいファイルシステムなしで実行状態に戻る必要があります/dev/ptmxpt_chowndevpts

したがって、マウントオプションが間違っているunlockpt()場合、devptsGNU Cライブラリは実際にgrantpt()

追加読書

関連情報