私は現在、システムのシリアルポートに関する情報を取得するためにすでに特別なフレームワークを使用しているシリアルポートライブラリを開発しています。シリアルポートはUnixの基本設計ですが、答えは次のとおりです。これ証明 - ファイルがシリアルポートであるかどうかをテストする良い方法は、文字デバイスのデフォルトモードをテストし、これが実際にシリアルポートであることを確認することですTTY
。
TTY
インターネットを検索してみると、ユニスの主なパターンに関する文書が見つかりません。さて、ptmxにメジャーモード5があるという内容が記載されているLinuxのマニュアルページはただ1つだけです。
ttyベースの文字デバイスの実装の詳細について問い合わせましたが、このスタックはオーバーフローします。 質問、Unix Stack Exchange コミュニティに聞いてみるとわかりそうです。どのようにtty値はUnixバージョン全体で安定しています。
したがって、システム上のすべてのttyファイルの主なモードの知識ベースを構築するのに役立ちます。つまり:主なモードは何ですか?
- 実際のシリアルポート?
- 疑似ターミナル(
PTS
)ポート? FTDI USB
シリアルポート?- 別の
USB
シリアルポート?
文字デバイスの主なモード値を取得するには、次のものを使用する必要があります。
% stat -f " * %N: %Hr%n" /dev/tty* /dev/pts/*
* /dev/ttys001: 16
^^- major mode
または古いものを使用してくださいls
。
% ls -l /dev/ttys001
crw--w---- 1 <user> tty 16, 1 Apr 30 03:25 /dev/ttys001
major mode -^^ ^^- minor mode
自分の回答に情報を追加したり、追加情報でコミュニティウィキの回答を拡張したりできます。
答え1
Unixバージョン7(1979):
# ls -l /dev/console /dev/tty?*
crw--w--w- 1 root 0, 0 Sep 22 06:46 /dev/console
crw-rw-r-- 1 root 0, 1 Sep 22 05:47 /dev/tty1
crw-rw-r-- 1 root 0, 2 Sep 22 05:47 /dev/tty2
(まだptyはありません)
Linux 3.2.0(Debian ハルトック)。
/dev
注:グループの所有者とをtty
検索して見つけることもできますdialout
。それはDebianの仕事です。
- 仮想コンソール
/dev/tty[0-9]*
:4
- 物理シリアルポート:
/dev/ttyS[0-9]+
:4
- 擬似端末:
/dev/pts/[0-9]+
: 136/dev/pts/ptmx
: 5
- FTDI USBシリアルポート:
/dev/ttyUSB[0-9]+
:188
- USBシリアルポート:(AVR組込みUSB/Arduino Uno)
/dev/ttyACM[0-9]+
: 166
Linux 3.4.0(Android 4.4.2/Nexus 5)
注:すべてのLinuxには次の機能が含まれています。
- ttyACM(セルラーモデム制御)
- (
/dev
アイテムがないようです):166
- (
- ttyHSL(ブルートゥース)
/dev/ttyHSL0
: 247
- ttyHS(ブルートゥース)
/dev/ttyHS99
: 248
ダーウィン13.1.0(MacOS 10.9.2):
- 物理シリアルポート:
/dev/ttys[0-9a-f]
:4
- 擬似端末:
/dev/ttys[0-9]{3}
:16
- FTDI USBシリアルポート:
/dev/tty.usbserial.*
:18
- USBシリアルポート:(AVR組込みUSB/Arduino Uno)
/dev/tty.usbmodem.*
:18
Solaris 10 x86/amd64:
擬似端末:
/dev/pty[p-r][0-9a-f]
(PTYマスター):25/dev/tty[p-r][0-9a-f]
(PTYスレーブ):26/dev/pts/[0-9]+
:二十四/dev/ptmx
:二十三
シリアルデバイス:
/dev/tty[abc...]
別名/dev/term/[abc...]
または/dev/tty0[012..]
(UART直列図):106- また、
/dev/ttyd[012...]
さまざまなインターフェース(電話、モデム)があり、106個ですが、高レベルのマイナーがあります。
オープンBSD 6.0
コメントで述べたように/dev/MAKEDEV
- PC/AT UART シリアルポート:
/dev/tty[0-7][0-9a-f]
: 8/dev/cua[0-7][0-9a-f]
: 8
- Cycladesシリアルポート:
/dev/ttyc*
:38/dev/cuac*
:38
- Virtioシリアルポート:
/dev/ttyVI*
:94
- USBシリアルポート:
/dev/ttyU[0-3]
:66/dev/cuaU[0-3]
:66
- wscons端末:
/dev/tty[C-J][0-b]
:12
- 擬似ターミナルマスター - スレーブ(UNIX 98ではない)
/dev/pty[p-zP-T][0-9a-zA-Z]
: 6/dev/tty[p-zP-T][0-9a-zA-Z]
: 5
FreeBSD 10.0とTrueOS
FreeBSD(およびTrueOSなどの派生製品)は、アイデアの致命的な欠陥を示す場所です。そこいいえFreeBSDのメジャー+マイナーデバイス番号指定方式。
devfs
/dev
FreeBSDの擬似ファイルシステムは、通常、プライマリ+セカンダリシステムをまったく使用しないシステムにインストールされ、デバイスを「基本」クラスにグループ化します。逆に、研究開発人材デバイスの inode 番号は擬似ファイルシステムの inode 番号と同じです。 inode は、デバイスノードが作成されると、その時点でシステムの正確なハードウェアに従って昇順に割り当てられます。
したがって、そのデバイス番号をショートカットとして使用することはできませんisatty()
。
答え2
Linux 3.8.2ソースツリーでは:
$ cscope -dL1 '.*MAJOR' | grep -e TTY -e PTS -e PTY
drivers/s390/char/sclp_vt220.c .*MAJOR 31 #define SCLP_VT220_MAJOR TTY_MAJOR
drivers/staging/net/pc300_tty.c .*MAJOR 62 #define CPC_TTY_MAJOR CYCLADES_MAJOR
drivers/staging/sb105x/sb_pci_mp.h .*MAJOR 42 #define SB_TTY_MP_MAJOR 54
drivers/tty/rocket_int.h .*MAJOR 1168 #define TTY_ROCKET_MAJOR 46
drivers/tty/serial/apbuart.c .*MAJOR 38 #define SERIAL_APBUART_MAJOR TTY_MAJOR
drivers/tty/serial/atmel_serial.c .*MAJOR 79 #define SERIAL_ATMEL_MAJOR TTY_MAJOR
drivers/tty/serial/pmac_zilog.c .*MAJOR 93 #define PMACZILOG_MAJOR TTY_MAJOR
drivers/tty/serial/serial_txx9.c .*MAJOR 45 #define TXX9_TTY_MAJOR 204
drivers/tty/serial/serial_txx9.c .*MAJOR 50 #define TXX9_TTY_MAJOR TTY_MAJOR
drivers/usb/class/cdc-acm.h .*MAJOR 21 #define ACM_TTY_MAJOR 166
drivers/usb/serial/ipw.c .*MAJOR 55 #define IPW_TTY_MAJOR 240
include/linux/isdn.h .*MAJOR 41 #define ISDN_TTY_MAJOR 43
include/linux/isdn.h .*MAJOR 42 #define ISDN_TTYAUX_MAJOR 44
include/linux/usb/serial.h .*MAJOR 21 #define SERIAL_TTY_MAJOR 188
include/net/irda/ircomm_tty.h .*MAJOR 45 #define IRCOMM_TTY_MAJOR 161
include/uapi/linux/major.h .*MAJOR 13 #define PTY_MASTER_MAJOR 2
include/uapi/linux/major.h .*MAJOR 16 #define PTY_SLAVE_MAJOR 3
include/uapi/linux/major.h .*MAJOR 17 #define TTY_MAJOR 4
include/uapi/linux/major.h .*MAJOR 18 #define TTYAUX_MAJOR 5
include/uapi/linux/major.h .*MAJOR 144 #define UNIX98_PTY_MASTER_MAJOR 128
include/uapi/linux/major.h .*MAJOR 146 #define UNIX98_PTY_SLAVE_MAJOR (UNIX98_PTY_MASTER_MAJOR+UNIX98_PTY_MAJOR_COUNT)
include/uapi/linux/major.h .*MAJOR 169 #define IBM_TTY3270_MAJOR 227
net/bluetooth/rfcomm/tty.c .*MAJOR 40 #define RFCOMM_TTY_MAJOR 216
UNIX98_PTY_MAJOR_COUNT は 8 で、これは pty-slave=136 を提供しますが、他に使用されないようです。
心に浮かぶもう一つのことは次のとおりです。
drivers/tty/hvc/hvc_console.c .*MAJOR 48 #define HVC_MAJOR 229
(XENシリアルデバイス)。
ダイナミックに割り当てられたデフォルト番号を持つ番号もあります。たとえば、
tty_drv->driver_name = "sdio_uart";
tty_drv->name = "ttySDIO";
tty_drv->major = 0; /* dynamically allocated */
tty_register_driver
0へのすべての呼び出しを見つけることができますdriver->major
。
一部は、メジャー番号をカーネル/モジュール引数として提供することもできます。たとえばhso
。
したがって、Linuxでは、/proc/devicesでメジャーを見つけ、メジャー番号ではなくドライバ名に基づいて決定する必要があるように聞こえます。