web-dev-qa-db-ja.com

一般的なキャラクターデバイスのペアを作成する

標準の擬似端末と同じプロパティを持つが、特定の名前で名前を付けることができる文字デバイスを作成したいと思います。

基本的には、再利用できる番号ではなく、/ dev/pts/my-unique-nameが必要です。それを行う方法はありますか?たとえば、mknodは任意に接続されたcharデバイスを作成できますか?

2
viraptor

mknodは、いくつかの例外を除いて機能します。構文は次のとおりです。

mknod /path/to/new/dev c major minor

したがって、たとえば、次のコマンドを使用して新しいptsタイプのデバイスを作成できるはずです。

mknod /tmp/mypts c 136 0

ただし、/ dev/ptsでこれを実行しようとすると、アクセス拒否メッセージが表示されることがわかりました。/dev/ptsではなく、/ devで実行できます。私はCentos5.5ボックスを使用しています。 YMMV。

これは、/ dev/ptsがカーネルによって(私の/ etc/fstabファイルから)マウントされるためです。

devpts                  /dev/pts                devpts  gid=5,mode=620  0 0

これはカーネル管理の疑似ファイルシステムであり、それをいじくり回すのは良い考えではないと思います。そこで作成された新しいファイルを取得する標準的な方法は、open()ing/dev/ptmxです。これにより、呼び出しプロセスにマスター端末のfdが割り当てられ、新しいデバイスが/ dev/pts/Xとして作成されます。ここで、Xはptmxによってスレーブとして動的に割り当てられます。その後、これは通常、元のプロセスから分岐したプロセスによって自動的に開かれます。

それがこのように行われるのには、おそらく正当な理由があります。それが何であるかはわかりませんが、システムの安定性が重要なものである場合は、それを破ろうとはしません。

そうは言っても、私が提示した実際のオプションを備えた最初のコマンドラインでは、どこにでも独自のptsデバイスを作成できますしかし/dev/pts、そしてそれをどうするつもりかによって、多分それはあなたが行くところにあなたを連れて行くのに十分です。

1
malcolmpdx

あなたが求めているのは、本質的には BSD疑似端末 を使用するためのユースケースです。 BSD疑似端末デバイスドライバーには256ペアのiノード番号があり(各ペアはマスターとスレーブで構成されています)、対応するiノードはインストール時に/ devに作成され、そのままにしておきました。

カーネルには特定の命名を強制するものはありませんが、未使用のペアを検索する必要があるアプリケーションは、通常、命名についてある程度の期待を抱いています。

ほとんどの人は、Unix 98疑似端末の導入により、BSD疑似端末が廃止されたと考えています。また、複数のLinuxディストリビューションがBSD疑似端末のサポートを終了したようです。ただし、BSD疑似端末をまだサポートしているカーネルが見つかった場合は、そのサポートを使用して、要求しているとおりにデバイスiノードのペアを作成できます。

mknod /dev/my-master c 2 42
mknod /dev/my-slave c 3 42

/dev/ptsはUnix98疑似端末用であるため、これらは/dev/ptsの外部にとどまる必要があることに注意してください。

文字のストリームを転送するだけで、疑似端末が提供する他のすべての機能を必要としない場合は、名前付きパイプを使用する方が簡単な場合があります。

1
kasperd