저는 현재 시스템의 직렬 포트에 대한 정보를 얻기 위해 이미 특수 프레임워크를 사용하는 직렬 포트 라이브러리를 개발 중입니다. 직렬 포트는 Unix의 기본 설계이지만 대답은 다음과 같습니다.이것증명 - 파일이 직렬 포트인지 테스트하는 좋은 방법은 문자 장치의 기본 모드를 테스트하고 이것이 실제로 직렬 포트인지 확인하는 것입니다 TTY
.
TTY
인터넷을 검색해 보면 유니스의 주요 패턴에 대한 문서를 찾을 수 없습니다 . 글쎄, ptmx에 메이저 모드 5가 있다는 내용이 나와 있는 Linux 매뉴얼 페이지는 단 하나뿐입니다.
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
유닉스 버전 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가 없습니다)
리눅스 3.2.0(데비안 헐떡임).
/dev
참고: 그룹 소유 및 tty
를 검색하여 찾을 수도 있습니다 dialout
. 그것은 데비안의 일입니다.
- 가상 콘솔
/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
리눅스 3.4.0(안드로이드 4.4.2/Nexus 5)
참고: 모든 Linux에 다음 기능이 포함되어 있습니다.
- ttyACM(셀룰러 모뎀 제어)
- (
/dev
항목이 없는 것 같습니다): 166
- (
- ttyHSL(블루투스)
/dev/ttyHSL0
: 247
- ttyHS(블루투스)
/dev/ttyHS99
: 248
다윈 13.1.0(맥OS 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
솔라리스 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에서 메이저를 찾아 메이저 번호가 아닌 드라이버 이름을 기준으로 결정해야 하는 것처럼 들립니다.