web-dev-qa-db-ja.com

UnixのTTYメジャー番号は何ですか?

私は現在、システムのシリアルポートに関する情報を取得するために特別なフレームワークをすでに使用しているシリアルポートライブラリに取り組んでいます。シリアルポートはUnixの基本的な設計ですが、 これ のような答えが証明するように、ファイルがシリアルポートであるかどうかをテストする良い方法は、文字のメジャーモードをテストすることだと思いました。デバイスを使用して、これが実際にTTYであるかどうかを確認します。

インターネット上をクロールしていると、ユニス全体のTTYsの主要なモードについて説明しているドキュメントは見つかりませんでした。さて、ptmxがメジャーモード5を持っていると述べているLinuxのmanページは1つだけです。

このStack Overflow の質問に基づいて、tty文字デバイスの実装の詳細についてはすでに質問しましたが、Unix Stack Exchangeコミュニティにhow安定した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

あなたはあなた自身の答えに情報を置くか、追加情報でコミュニティウィキの答えを拡張することができます。

6
zmo

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 wheezy)。

注:グループttydialoutが所有するものを_/dev_で検索しても、これらを見つけることができます。これは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(Bluetooth)
    • _/dev/ttyHSL0_:247
  • ttyHS(Bluetooth)
    • _/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 master):25
    • _/dev/tty[p-r][0-9a-f]_(ptyスレーブ):26
    • _/dev/pts/[0-9]+_:24
    • _/dev/ptmx_:23
  • シリアルデバイス:

    • _/dev/tty[abc...]_別名_/dev/term/[abc...]_または_/dev/tty0[012..]_(uartシリアル、また):106
    • _/dev/ttyd[012...]_としても使用されますが、インターフェイス(ダイヤル、モデム)が異なり、106でも未成年者が多くなります。

OpenBSD 6.0

_/dev/MAKEDEV_の解説に記載されているとおり

  • PC/AT UARTシリアルポート:
    • _/dev/tty[0-7][0-9a-f]_:8
    • _/dev/cua[0-7][0-9a-f]_:8
  • キクラデスのシリアルポート:
    • _/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

FreeBSD10.0およびTrueOS

FreeBSD(およびTrueOSなどのその派生物)は、あなたのアイデアが致命的な欠陥を示しているところです。そこにありません FreeBSDのメジャー+マイナーデバイス番号スキーム。

FreeBSDのdevfs疑似ファイルシステムは、従来は_/dev_にマウントされていましたが、デバイスを「メジャー」クラスにグループ化するためにメジャー+マイナーシステムをまったく使用していません。むしろ、デバイスのrdevは、疑似ファイルシステムのiノード番号と同じです。デバイスノードが生成されるときに、iノードは単純に昇順で割り当てられます。当時手元にあったマシン。

したがって、デバイス番号をisatty()のショートカットとして使用することはできません。

7
zmo

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になりますが、他の方法では使用されていないようです。

頭に浮かぶもう1つのもの:

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へのすべての呼び出しを探すことができます。ここでdriver->majorは0です。

カーネル/モジュールパラメータとしてメジャー番号を指定できるものもあります。たとえば、hso

したがって、Linuxでは、/ proc/devicesでメジャーを検索し、メジャー番号ではなくドライバー名に基づいて決定する必要があるように思われます。

1