Qual é o maior número de TTY do seu Unix?

6

Atualmente, estou trabalhando em uma biblioteca de porta serial que já usa estruturas especiais para obter informações sobre portas seriais no sistema. Embora as portas seriais sejam um design fundamental no Unix - como uma resposta como essa prova - achei que um bom maneira de testar se um arquivo é uma porta serial é testando o modo principal do dispositivo de caractere e verifique se isso é realmente um TTY ou não.

Rastreamento na Internet, não consegui encontrar nenhuma documentação falando sobre os principais modos de TTY s entre os unices. Bem, há apenas uma página man do Linux dizendo que o ptmx tem o modo principal 5.

Embora eu já tenha perguntado sobre os detalhes de implementação do dispositivo de caracteres tty com base em este estouro de pilha pergunta, eu pensei que poderia pedir à comunidade Unix Stack Exchange para descobrir como estáveis os valores tty estão entre os sabores Unix.

Então, eu estou pedindo sua ajuda para construir uma base de conhecimento do modo Major de todos os seus tty arquivos em seu (s) sistema (s), ou seja: qual é o principal modo de

  • portas seriais reais?
  • pseudo terminal ( PTS ) portas?
  • FTDI USB Portas seriais?
  • outras USB portas seriais?

Para obter os valores para o modo principal de um dispositivo de caractere, você deve procurar usando:

% stat -f " * %N: %Hr%n" /dev/tty* /dev/pts/*
 * /dev/ttys001: 16
                 ^^- major mode

ou usando o bom e velho ls :

% ls -l /dev/ttys001
crw--w----  1 <user>  tty   16,   1 Apr 30 03:25 /dev/ttys001
                major mode -^^   ^^- minor mode

Você pode colocar as informações em sua própria resposta ou estender a resposta do wiki da comunidade com informações adicionais.

    
por zmo 30.04.2014 / 14:19

2 respostas

6

Versão 7 do Unix (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

(não há ainda)

Linux 3.2.0 (debian wheezy).

Observação: você também pode encontrá-los pesquisando /dev por pertencer ao grupo tty e dialout . Isso é uma coisa do Debian.

  • Consoles virtuais
    • /dev/tty[0-9]* : 4
  • Portas seriais reais:
    • /dev/ttyS[0-9]+ : 4
  • Pseudo terminais:
    • /dev/pts/[0-9]+ : 136
    • /dev/pts/ptmx : 5
  • Porta serial USB FTDI:
    • /dev/ttyUSB[0-9]+ : 188
  • Porta serial USB: ( AVR embutido USB / Arduino Uno )
    • /dev/ttyACM[0-9]+ : 166

Linux 3.4.0 (Android 4.4.2 / Nexus 5)

Nota: tem todos os linux mais:

  • ttyACM (controle de modem de celular)
    • (sem /dev entry, aparentemente): 166
  • ttyHSL (Bluetooth)
    • /dev/ttyHSL0 : 247
  • ttyHS (Bluetooth)
    • /dev/ttyHS99 : 248

Darwin 13.1.0 (MacOS 10.9.2):

  • Portas seriais reais:
    • /dev/ttys[0-9a-f] : 4
  • Pseudo terminais:
    • /dev/ttys[0-9]{3} : 16
  • Porta serial USB FTDI:
    • /dev/tty.usbserial.* : 18
  • Porta serial USB: ( AVR embutido USB / Arduino Uno )
    • /dev/tty.usbmodem.* : 18

Solaris 10 x86 / amd64:

  • Pseudo-terminais:

    • /dev/pty[p-r][0-9a-f] (pty master): 25
    • /dev/tty[p-r][0-9a-f] (escravo pty): 26
    • /dev/pts/[0-9]+ : 24
    • /dev/ptmx : 23
  • Dispositivos seriais:

    • /dev/tty[abc...] aka /dev/term/[abc...] ou /dev/tty0[012..] (série uart, também): 106
    • também como /dev/ttyd[012...] , mas com interface diferente (discagem, modem) também em 106, mas menores de idade.

OpenBSD 6.0

Conforme documentado no comentário em /dev/MAKEDEV

  • Portas seriais PC / AT UART:
    • /dev/tty[0-7][0-9a-f] : 8
    • /dev/cua[0-7][0-9a-f] : 8
  • Portas seriais das Cyclades:
    • /dev/ttyc* : 38
    • /dev/cuac* : 38
  • Portas seriais do Virtio:
    • /dev/ttyVI* : 94
  • portas seriais USB:
    • /dev/ttyU[0-3] : 66
    • /dev/cuaU[0-3] : 66
  • terminais wscons:
    • /dev/tty[C-J][0-b] : 12
  • Mestre e escravo do terminal pseudo (não-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 e TrueOS

O FreeBSD (e seus derivados, como o TrueOS) é onde sua ideia mostra uma falha fatal. Existe não esquema maior + menor número de dispositivos no FreeBSD.

O pseudo sistema de arquivos devfs no FreeBSD, convencionalmente montado em /dev , não usa um sistema major + minor para agrupar dispositivos em classes "principais". Em vez disso, o rdev para o dispositivo é o mesmo que seu número de nó i no pseudo sistema de arquivos, com i-nodes simplesmente atribuídos em ordem crescente conforme os nós de dispositivo são gerados, dependendo do hardware exato em a máquina na mão no momento.

Portanto, o número do dispositivo não pode ser usado como um atalho para isatty() .

    
por 27.01.2017 / 20:10
1

Em uma árvore fonte do 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, o que dá ao seu pty-slave = 136, mas não parece ser usado de outra forma.

Outro que vem à mente:

drivers/tty/hvc/hvc_console.c .*MAJOR 48 #define HVC_MAJOR 229

(os dispositivos seriais XEN).

Agora, também há um número com um número principal alocado dinamicamente. Por exemplo:

    tty_drv->driver_name = "sdio_uart";
    tty_drv->name =   "ttySDIO";
    tty_drv->major = 0;  /* dynamically allocated */

Você pode procurar todas as chamadas para tty_register_driver , em que driver->major é 0.

Alguns você também pode fornecer o número principal como um parâmetro do kernel / module. Por exemplo hso .

Assim, no Linux, parece que você teria que pesquisar o principal em / proc / devices e decidir com base no nome do driver, e não no número principal.

    
por 30.04.2014 / 15:42