POSIX 단말 인터페이스

POSIX terminal interface

POSIX 터미널 인터페이스는 프로그램용 애플리케이션 프로그래밍 인터페이스와 POSIX 표준 및 단일 유닉스 사양에 정의된 터미널 사용자의 일련의 행동 기대치로 구성된 일반화된 추상화입니다.이는 BSD 버전4 및 7 Edition Unix의 터미널 인터페이스에서 유래한 것입니다.

일반적인 기본 개념

하드웨어

UNIX 시스템에서는,[1][2] 복수의 I/O 디바이스가 「종단」이라고 간주됩니다.여기에는 다음이 포함됩니다.

단말기의 인텔리전스와 기능

인텔리전스: 단말기는 인텔리전트가 아닌 벙어리

동시대 메인프레임이나 미니컴퓨터와[citation needed] 달리, 원래의 Unix 시스템은 멍청한 단말만을 위해 개발되었으며,[6] 오늘날에도 마찬가지입니다.단말기는 문자 지향 장치이며,[6][7] 장치와의 사이에서 송수신되는 문자의 스트림을 포함한다.문자의 스트림은 제어 문자, 이스케이프 코드 및 특수 문자를 포함하여 구조화되지만 I/O 프로토콜은 스마트 또는 지능형 단말기의 I/O 프로토콜처럼 구조화되지 않습니다.필드 형식 지정은 없습니다.입력 데이터의 전체 화면(입력 양식)에 대한 블록 전송은 없습니다.

반면 폐쇄형 아키텍처의 메인프레임과 미니컴퓨터는 일반적으로 블록 지향 단말기를 사용합니다.

기능: termfo, termcap, curses 등

단말기의 "기능"은 프로그램이 사용할 수 있는 순수한 텔레타이프라이터에서 사용할 수 있는 것 이상의 다양한 멍청한 단말기로 구성됩니다.이러한 코드(주로)는 단말기와 송수신 가능한 이스케이프 코드로 구성됩니다.단말기로 전송되는 이스케이프 코드는 CRT 단말기(또는 소프트웨어 단말기 에뮬레이터)가 할 수 없는 다양한 기능을 수행합니다.예를 들어 단말기의 커서를 화면상의 위치로 이동하거나 화면의 전부 또는 일부를 삭제하거나 스크롤하거나 연결된 프린터 디바이스의 온/오프, 프로그램 가능한 기능 키,디스플레이 색상 및 속성 변경(리버스 비디오 등) 및 디스플레이 제목 문자열 설정단말기로부터 수신된 이스케이프 코드는 기능 키, 화살표 키 및 기타 특수 키 스트로크( 키, 엔드 키, 도움말 키, PgUp 키, PgDn 키, 삽입 키, 삭제 키 등)[8][9]를 나타냅니다.

이러한 기능은 시스템 관리자가 구성하고 termfo 라이브러리(구 termcap 라이브러리 대신)를 통해 프로그램에서 액세스하는 데이터베이스로 인코딩됩니다.이 라이브러리에는 저주ncurses 라이브러리와 같은 라이브러리가 구축됩니다.응용 프로그램에서는 터미널 기능을 사용하여 텍스트 사용자 인터페이스에 창, 대화 상자, 버튼, 라벨, 입력 필드, 메뉴 [10][11]등을 제공합니다.

제어 환경 변수:TERM

(단말기 인식) 프로그램의 입력 및 출력이 사용하는 단말기의 특정 기능 세트는 프로그램 및 라이브러리에 유선 접속되지 않고 데이터베이스에서 취득되며, 에 의해 제어됩니다.TERM 환경변수(및 옵션으로 termcap 및 termfo 라이브러리의 경우)TERMCAP그리고.TERMINFO환경변수).[10]이 변수는 터미널 모니터 프로그램이 프로그램을 생성하면 해당 터미널을 입력 및 출력에 사용하거나 때로는 명시적으로 사용할 수 있습니다.예를 들어 다음과 같습니다.

  • getty 프로그램(또는 동등한 프로그램)은,TERM시스템 데이터베이스(ttymon 또는 launchd 프로그램의 컨피규레이션파일 또는 ttymon 또는 launchd 프로그램의 컨피규레이션파일)에 따라 환경변수를 지정합니다.이러한 변수는 어떤 로컬 단말기가 어떤 시리얼 포트에 접속되어 있는지, 어떤 단말기가 로컬 가상 단말기 또는 로컬시스템콘솔에 의해 제공되는지를 정의합니다.
  • 리모트 단말기의 다이얼 업 유저는, 시스템이 그 다이얼 업 회선상에서 일반적으로 상정하고 있는 타입의 단말기를 사용하고 있지 않기 때문에, 수동으로 설정한다.TERM올바른 타입에 로그인한 직후의 환경변수(통상은 다이얼 업 회선의 getty 프로그램에 의해 설정된 단말 타입이 다이얼 업 유저가 리모트 단말기를 사용하고 있는 다이얼 업 유저에 의해서 가장 자주 사용된다고 판단되어 다이얼 업 유저가 사용하는 것과 일치하고, 그 유저는 단말 타입을 덮어쓸 필요가 없습니다.e)
  • SSH 서버 데몬(또는 rlogin 데몬 등 동등한 것)은, 다음의 설정을 실시합니다.TERMSSH [12]클라이언트와 같은 단말 타입의 환경 변수.
  • 소프트웨어 터미널 에뮬레이터는 의사 터미널을 사용하여TERM에뮬레이트할 단말기의 유형을 지정하기 위한 환경변수.에뮬레이트된 단말기는 실제 단말기 하드웨어와 정확하게 일치하지 않는 경우가 많아 단말기 에뮬레이터에는 전용 타입명이 있습니다.xterm 프로그램(기본값)은 다음과 같이 설정됩니다.xterm예를 [13]들어 터미널 유형으로 지정합니다.GNU Screen 프로그램 세트screen단말 타입으로 합니다.

작업 제어

터미널은 작업 제어 기능을 제공합니다.인터랙티브하게 단말기의 사용자는 현재 실행 중인 작업을 일시 중단하고 작업을 생성한 인터랙티브 작업 제어 셸로 되돌리는 제어 문자를 전송할 수 있으며 작업을 "백그라운드"에 배치하거나 다른 백그라운드 작업을 포그라운드로 전환하는 명령을 실행할 수 있습니다(필요에 [14][15]따라 작업을 일시 중단 해제).

라인 부문

엄밀히 말하면 Unices에서 단말 장치는 기본 tty 디바이스 드라이버로 구성됩니다.이 드라이버는 I/O 명령을 통해 디바이스 하드웨어를 물리적으로 제어하고 디바이스의 문자 입출력 인터럽트 요구를 처리하고 회선 규율을 처리합니다.회선 규율은 실제 디바이스 하드웨어와는 무관하며, 복수의 제어 단자를 담당하는 단말 콘센트레이터 디바이스에도 의사 피부와 같은 회선 규율을 사용할 수 있다.실제로 회선규격(BSD, AIX 및 기타 시스템의 경우 회선규격)은 모든 단말장치에서 동일합니다.로컬 에코, 회선 편집, 입력 모드 처리, 출력 모드 처리 및 문자 매핑을 담당하는 것은 회선 규칙입니다.이 모든 것은 실제 하드웨어와는 무관하며 tty 디바이스 드라이버에 의해 제공되는 단순한 추상화(문자 전송, 문자 수신, 다양한 하드웨어 [16][17]상태 설정)와 같이 처리됩니다.

7 Edition Unix, BSD 시스템 및 MacOSLinux를 포함한 파생 제품에서는 각 단말 장치를 여러 [18]라인 분야로 전환할 수 있습니다.AT&T STREAMS 시스템에서 회선 부문은 STREAMS I/O스택에 [19]푸시 및 드롭할 수 있는 STREAMS 모듈입니다.

역사

POSIX 터미널 인터페이스는 다양한 Unix 시스템의 터미널 인터페이스에서 파생됩니다.

초기 통합:제7판 Unix

Unix 32V와 7th Edition Unix에 의해 제공되는 터미널 인터페이스는 BSD 버전 4에 의해 이전 터미널 드라이버로도 제공되었으며, 주로 터미널로서 텔레타이프라이터에 맞춰져 있었다.입력은 한 번에 한 줄씩 입력되며 운영 체제의 터미널 드라이버(단말기 자체가 아님)는 간단한 회선 편집 기능을 제공합니다.버퍼는 편집이 수행된 커널에 의해 유지되었습니다.터미널 입력을 읽는 응용 프로그램은 버퍼의 내용을 수신할 수 있는 것은, 다음의 경우에 한정됩니다.return 단말기에서 키를 눌러 엔드 라인 편집을 수행했습니다.단말기에서 시스템으로 전송된 키는 편집 버퍼의 현재 내용 전체를 지우고('kill'), 보통 ''로 표시됩니다.@' 기호 뒤에 새 줄 시퀀스를 추가하여 인쇄 위치를 새 빈 줄로 이동합니다.단말기에서 시스템으로 전송되는 키는 편집 버퍼의 끝에서 마지막 문자를 지우고 보통 '#' 기호로 표시되며, 사용자는 이를 이전 문자의 "rubout"을 나타내는 것으로 인식해야 합니다(텔레타이프라이터는 문자를 인쇄한 후에는 물리적으로 지울 수 없습니다).용지를 참조해 주세요).[20][21][22][23][18]

프로그래밍의 관점에서 단말 장치는 송신 및 수신 보레이트, "삭제" 및 "킬" 문자(설명한 바와 같이 회선 편집을 실행), "인터럽트" 및 "종료" 문자(단말기가 제어단말기였던 모든 프로세스에 대한 신호 생성), "시작" 문자 및 "정지" 문자(모뎀 흐름 콘트롤러에 사용)를 가지고 있습니다.ol), "파일 끝" 문자(에 의해 버퍼에서 폐기된 경우를 제외하고 캐리지 리턴과 같이 동작합니다).read()로컬 에코가 커널의 터미널 드라이버에 의해 에뮬레이트되었는지 여부, 모뎀플로우 제어가 활성화되었는지 여부, 다양한 출력 지연의 길이, 캐리지 리턴 문자의 매핑 및 3개의 입력 [24]모드를 결정하는 다양한 기본 모드플래그).

3가지 입력 모드는 다음과 같습니다.

회선 모드(일명 "조리 완료" 모드)

라인 모드에서 라인 부문은 모든 라인 편집 기능을 수행하고 "인터럽트" 및 "종료" 제어 문자를 인식하여 프로세스로 전송되는 신호로 변환합니다.사용자가 [21][25]복귀를 누르면 회선 편집이 완료된 후 단말기에서 읽은 응용 프로그램 프로그램이 전체 회선을 수신합니다.

cbreak 모드

cbreak 모드는 한 번에 2개의 문자 모드 중 하나입니다.(Stephen R). 은 농담삼아 그것을 "반조리"라고 언급했고, 따라서 "희귀한" 모드라고 말했다.라인 부문은 라인 편집을 수행하지 않으며 라인 편집 기능의 제어 시퀀스는 일반 문자 입력으로 처리됩니다.단말기에서 읽히는 응용 프로그램 프로그램은 읽을 입력 대기열에 문자를 사용할 수 있는 즉시 문자를 수신합니다.단, "interrupt" 및 "quit" 제어 문자와 모뎀플로우 제어 문자는 여전히 특수하게 처리되어 [26][27]입력 스트림에서 삭제됩니다.

raw 모드
raw 모드는 한 번에 2개의 문자 모드 중 하나입니다.라인 부문은 라인 편집을 수행하지 않으며 라인 편집 기능과 다양한 특수 문자("인터럽트", "종료")에 대한 제어 시퀀스는 일반 문자 입력으로 처리됩니다.단말기에서 읽어낸 애플리케이션 프로그램은 단말 장치 자체에서 [28][26][27]온 것과 마찬가지로 문자를 즉시 수신하고 문자 스트림 전체를 변경하지 않고 수신한다.

이러한 모든 모드와 제어 문자를 쿼리 및 수정하기 위한 프로그램인터페이스가 시스템콜이었습니다(이것에 의해,stty()그리고.gtty()6 Edition Unix의 시스템콜)[29][30]「삭제」와 「킬」문자는, 및 디폴트로부터 변경할 수 있었습니다만, 오랜 세월에 걸쳐, 단말 디바이스 드라이버와 많은 UNIX 시스템에서는, 유저가 유저명과 패스워드를 입력한 후에 실행되는 시스템로그인 스크립트로 단말 디바이스의 설정을 변경했을 뿐입니다.로그인 프롬프트 및 패스워드 프롬프트에서의 오류는 모두 텔레타이프 라이터 [23]단말기에서 상속된 이력 편집 키 문자를 사용하여 수정해야 합니다.

BSD: 작업 제어의 등장

BSD Unices에서는 작업 제어와 확장 [18]기능을 갖춘 새로운 터미널 드라이버가 도입되었습니다.이러한 확장자는 (다시 프로그래밍 방식으로 수정 가능한) 추가 특수 문자로 구성되었습니다.

  • suspend 및 delayed suspend 문자(기본값 Z+ 및 Y+ - ASCII 및 )가 새로운 생성의 원인이 되었습니다.SIGTSTP단말기의 제어 프로세스 그룹의 [27]프로세스에 신호를 보냅니다.
  • "word erase", "literal next" 및 "reprint" 문자(기본값 W+, V+ 및 R+)는 추가 줄 편집 기능을 수행했습니다."word erase"는 줄 편집 버퍼 끝에 있는 마지막 단어를 지웁니다."Literal next"(리터럴 넥스트)는 라인 편집 버퍼에 어떤 특수 문자도 입력할 수 있게 했다(제7 에디션 유닉스에서는 백슬래시 문자를 통해 다소 불편하게 사용할 수 있는 기능)."line"으로 인해 라인 편집 버퍼의 현재 내용이 새 라인에 재인쇄되었습니다(다른 백그라운드 프로세스가 [27]라인 편집과 혼합된 출력을 생성한 경우를 제외함).

이러한 모든 추가 모드와 제어 문자를 쿼리 및 수정하기 위한 프로그램인터페이스는ioctl()시스템 호출(Leffler et al. 1989, 페이지 262)은 이를 "좀 어수선한 인터페이스"라고 표현했습니다.기존의 7번째 에디션 Unix 기능은 모두 유지되었으며, 새로운 기능은 추가 기능을 통해 추가되었습니다.ioctl()그 결과, 명확하게 성장해, [31]기능의 몇개의 중복을 나타내는 프로그램인터페이스가 생성되었습니다.

시스템 III 및 시스템 V

시스템 III는 7번째 에디션의 별도 버전을 결합한 새로운 프로그래밍 인터페이스를 도입했습니다.ioctl()플래그를 취득 및 설정하고 제어 문자를 취득 및 설정하는 조작을 사용하여termio플래그와 제어 문자를 모두 보관하고 한 번의 작업으로 플래그를 배치하고 다른 한 번의 작업으로 설정할 수 있는 구조입니다.또한 7 Edition 인터페이스의 일부 플래그를 여러 개의 개별 플래그로 분할하고 일부 기능을 추가했지만 작업 제어 또는 4BSD의 [32]조리 모드 확장을 지원하지 않았습니다.예를 들어, 7번째 에디션의 "조리됨", "cbreak" 및 "raw" 모드를 다른 추상화로 대체했습니다.신호 생성 문자의 인식은 입력 모드와 독립적이며, 표준 및 비표준 입력 모드 두 가지만 있습니다.(이를 통해 7번째 에디션 및 BSD에는 없는 단말기 입력 모드가 허용됩니다.신호 생성을 디세블로 한 표준 모드입니다).

시스템 V를 포함한 시스템 III의 후계기에서도 같은 인터페이스가 사용되었습니다.

POSIX: 통합 및 추상화

POSIX 표준이 범용 단말 인터페이스의 정의로 해결한 주요 문제 중 하나는 과도한 프로그래밍 인터페이스였습니다.표준 시점까지 단말기의 동작은 시스템 간에 상당히 통일되어 있었지만, 대부분의 Unices는 회선 규율과 BSD 작업 제어 기능이라는 개념을 채택하고 있으며,ioctl()시스템 콜이 엉망이었다.제공된 유니케가 다르다ioctl()다른 (표준) 이름 및 다른 플래그를 가진 작업입니다.휴대용 소스 코드에는 소프트웨어 플랫폼 간의 차이를 수용하기 위해 상당한 양의 조건부 컴파일이 포함되어 있어야 했습니다. 비록 그것들이 모두 [33]Unix였지만 말입니다.

POSIX 규격은 다음 표준으로 대체됩니다.ioctl()시스템 전체가 라이브러리 기능(물론 플랫폼 고유의 기능을 통해 커버 아래에 구현될 수 있음)을 갖추고 있습니다.ioctl()표준화된 이름 및 매개변수를 사용하여 작업을 수행합니다.termioSystem V Unix의 데이터 구조는 POSIX의 템플릿으로 사용되었습니다.termios데이터 구조(현재 필드를 지정하기 위해 에일리어스 데이터 타입을 사용하고 있는 것 이외에는 거의 변경되지 않았습니다).이를 통해 구현자에 의해 여러 프로세서 아키텍처 간에 쉽게 포팅할 수 있도록 하기 위해 명시적으로 필요한 것이 아니라unsigned short그리고.charC 및 C++ 프로그래밍 언어의 데이터 [33][34]타입(일부 프로세서아키텍처에서는 사이즈가 불편할 수 있습니다).

POSIX는 또한 작업 제어에 대한 지원을 도입했습니다.termios시스템 III 및 시스템 V에서 지원되는 제어 문자와 더불어 일시 중단 및 지연 일시 중단 문자를 포함하는 구조입니다.SunOS 4.x, System V Release 4, Solaris, HP-UX, AIX, 새로운 BSD, macOSLinux는 BSD에서 익힌 모드 확장을 추가하지 않았습니다.termios.

표준에 정의되어 있는 것

터미널 및 프로세스 그룹 제어

시스템의 각 프로세스에는 1개의 제어단자가 있거나 제어단자가 전혀 없습니다.프로세스는 부모로부터 제어 단말기를 상속받으며, 프로세스에 대한 유일한 조작은 제어 단말기가 없는 프로세스에 의해 제어 단말기를 취득하고 제어 [33]단말기가 있는 프로세스에 의해 이를 포기하는 것이다.

제어단말기를 취득하는 휴대방법은 정의되어 있지 않으며, 구현방법은 정의되어 있다.이 규격에 의해O_NOCTTY시스템 콜용 플래그.이것은 기존의 제어단말기(제어단말기가 없는 프로세스)를 취득하는 것을 방지하는 방법입니다.open()다른 프로세스의 제어 단말기가 아닌 단말 디바이스 파일입니다.O_NOCTTYflag)를 지정하지만[35], 기존의 의미론은 옵션인 채로 합니다.

각 프로세스는 프로세스 그룹의 멤버이기도 합니다.각 단말 장치는 그 전경 프로세스 그룹이라고 불리는 프로세스 그룹을 기록한다.프로세스 그룹은 터미널 액세스 및 신호 전달을 제어합니다.단말기에서 생성된 신호는 단말기의 포그라운드 프로세스 그룹의 멤버인 모든 프로세스에 송신된다read().단말기의 포그라운드 프로세스 그룹의 멤버가 아닌 프로세스에 의해 단말기의 I/O 조작이 신호를 발생시킬 수 있으며 (각각 선택적으로) 발생시킬 수도 있다.SIGTTIN그리고.SIGTTOU기동 프로세스로 송신됩니다.다양한 터미널 모드 변경 라이브러리 함수는 다음과 같은 동작을 합니다.write()단, 이 기능이 다음 기간 동안 꺼진 경우에도 항상 신호를 생성합니다.write()[36][37]자체입니다.

termiosdata 구조

모든 터미널 라이브러리 콜에서 사용되는 데이터 구조는termiosC [38]및 C++ 프로그래밍 언어 정의는 다음과 같습니다.[34]

구조 종단 {     tcflag_t c_iflag ;  // 입력 모드     tcflag_t 지연 ;  // 출력 모드     tcflag_t c_cflag ;  // 제어 모드     tcflag_t c_lflag ;  // 로컬모드     cc_t c_cc[NCCS] ;   // 문자 제어 } ; 

내의 필드 순서termios구조는 정의되어 있지 않으며 구현에서는 비표준 [34]필드를 추가할 수 있습니다.실제로 구현에서는 입력 및 출력 보레이트를 기록하기 위해 비표준 필드를 추가해야 합니다.이들은 구현 정의 형식으로 구조물에 기록되며 표준화된 구조 [39]필드의 경우와 같이 필드 값을 직접 조작하는 것이 아니라 접근자 함수를 통해 액세스됩니다.

데이터 유형 별칭tcflag_t그리고.cc_t, 및 기호 상수NCCS다양한 모드 플래그, 제어 문자 이름 및 보레이트의 심볼 상수는 모두 표준 헤더에 정의되어 있습니다.termios.h(이것은, 같은 이름의 헤더와 혼동하지 말아 주세요.termio.h시스템 III 및 시스템 V에서 유사한 기능을 정의합니다.termio구조 및 비슷한 이름의 기호 상수들이 많이 있습니다.이 인터페이스는 시스템 III 및 시스템 V에 고유하며, 이 인터페이스를 사용하는 코드가 반드시 다른 시스템에 이식 가능한 것은 아닙니다.)[40]

구조체의 필드는 다음과 같습니다(요약 내용은 메인[clarification needed] 문서를 참조하십시오).

c_iflag
입력 모드 플래그: 입력 패리티, 입력 줄바꿈 변환, 모뎀플로우 제어, 8비트 청결도 및 (하이브리드포트의 '브레이크' 상태[34])에 대한 응답
c_oflag
다양한 제어 문자가 전송된[41][27] 후 구현 정의 출력 후 처리, 출력 줄바꿈 변환 및 출력 지연을 제어하는 출력 모드 플래그
c_cflag
회선 규율이 아닌 실제 단말 장치를 제어하기 위한 터미널 하드웨어 제어 플래그: 문자 내 비트 수, 패리티 유형, 행업 제어 및 시리얼 회선 흐름[42] 제어
c_lflag
단말 하드웨어가 아닌 회선 규율을 제어하기 위한 로컬 제어 플래그: 표준 모드, 에코 모드, 신호 생성 문자 인식 및 처리 및SIGTTOU로 신호하다.write()시스템[39] 호출

라이브러리 기능은 다음과 같습니다(요약, 자세한 내용은 메인 문서를[clarification needed] 참조하십시오).

tcgetattr()
터미널 디바이스의 현재 속성 설정을 쿼리하다termios구조[43]
tcsetattr()
단말 디바이스의 현재 속성 설정을termios구조, 선택적으로 대기 중인 출력이 배출되기를 기다리고 대기 중인[43] 입력을 플러시합니다.
cfgetispeed()
의 실장 정의 필드에서 입력 보레이트를 쿼리하다termios구조[44]
cfgetospeed()
의 실장 정의 필드에서 출력 보레이트를 쿼리하다termios구조[44]
cfsetispeed()
의 실장 정의 필드에서 입력 보레이트를 설정합니다.termios구조[44]
cfsetospeed()
의 실장 정의 필드에서 출력 보레이트를 설정합니다.termios구조[44]
tcsendbreak()
시리얼 디바이스[45] 단말기로 모뎀 '브레이크' 신호를 송신하다
tcdrain()
대기 중인 출력이 방전될 때까지[45] 기다리다
tcflush()
큐잉[45] 입력 폐기
tcflow()
변경 흐름[45] 제어
tcgetpgrp()
단말기의 포그라운드 프로세스[46] 그룹을 쿼리하다
tcsetpgrp()
단말기의 포그라운드 프로세스[46] 그룹 설정

특수 문자

프로그래밍 방식으로 수정할 수 있는 특수 문자[47][44]
들판 의미. 취득자read() 메모들
c_cc[VEOF] 파일 끝 아니요. 표준 모드 라인 편집에 의해서만 처리됩니다.
c_cc[VEOL] 줄의 끝. 네. 표준 모드 라인 편집에 의해서만 처리됩니다.
c_cc[VERASE] "실패" 아니요. 표준 모드 라인 편집에 의해서만 처리됩니다.
c_cc[VKILL] "죽이다 아니요. 표준 모드 라인 편집에 의해서만 처리됩니다.
c_cc[VINTR] 인터럽트 아니요. 입력 모드와 무관한 신호 생성 문자
c_cc[VQUIT] "실패" 아니요. 입력 모드와 무관한 신호 생성 문자
c_cc[VSUSP] "실패" 아니요. 입력 모드와 무관한 신호 생성 문자
c_cc[VSTOP] "정지" 아니요. 입력 모드에 의존하지 않는 모뎀 흐름 제어 문자
c_cc[VSTART] "시작" 아니요. 입력 모드에 의존하지 않는 모뎀 흐름 제어 문자

c_cc[]의 어레이 멤버termiosdata structure는 (정리적으로 변경 가능한) 모든 특수문자를 지정합니다.배열 내의 인덱스는 오른쪽 표와 같이 각 특수 문자 유형에 대해 하나씩 심볼 상수입니다(배열 내의 두 개의 추가 엔트리는 비표준 모드 입력 처리와 관련이 있으며 아래에 설명되어 있습니다).[43]

프로그래밍 방식으로 수정할 수 없는 특수 문자는 줄바꿈(ASCII)입니다.LF및 캐리지 리턴(ASCII)CR를 참조해 주세요.[47]

입력 처리

입력처리에 따라 동작 여부가 결정됩니다.read()단말장치에서의 시스템콜과 회선규제의 회선편집 및 신호생성 특성.7 Edition Unix 및 BSD 버전4의 경우와 달리 System III 및 System V의 경우와 마찬가지로 라인 편집은 표준 모드와 비표준 모드 중 하나로 동작합니다.이들 간의 기본적인 차이는 다음과 같은 경우 블록/비차단 요건의 관점에서 보면read()시스템 콜(로 지정)O_NONBLOCK파일 기술자의 플래그open()또는fcntl()), 데이터는 "[48]읽을 수 있습니다.

표준 모드 처리

표준 모드에서는 데이터는 회선 편집 버퍼에 축적되어 회선 딜리미터 문자를 송신하는 유저에 의해서 회선 편집이 종료될 때까지 「읽을 수 있는」이 되지 않는다.줄 구분 문자는 특수 문자로 파일 , 줄 및 줄 바꿈(ASCII)입니다.LF전자의 2개는 프로그래밍 방식으로 설정 가능하며 후자는 고정되어 있습니다.후자의 2개는 회선 편집 버퍼에 포함되어 있습니다만, 전자의 1개는 포함되어 있지 않습니다.[49]

보다 엄밀하게는 행 편집 버퍼에 0개 이상의 행이 누적되며, 행 구분자로 구분됩니다(한 번 폐기되거나 폐기되지 않을 수 있습니다).read()를 읽어낼 수 있습니다.또, 행 편집은, 버퍼내의 마지막 행 딜리미터(존재하는 경우) 뒤에 오는 행 편집 버퍼의 부분에서 동작합니다.따라서 예를 들어, "지우기" 문자(프로그램된 문자)는 앞의 줄 [49]구분자까지만 줄 버퍼 내의 마지막 문자를 지웁니다(포함하지 않음).

비표준 모드 처리

비표준 모드에서는 데이터는 버퍼(라인 편집 버퍼일 수도 있고 아닐 수도 있음)에 축적되어 2개의 입력제어 파라미터의 값에 따라 "읽을 수 있는" 상태가 됩니다.c_cc[MIN]그리고.c_cc[TIME]멤버termios데이터 구조둘 다 부호 없는 수량입니다(이유는cc_t는 부호 없는 타입의 에일리어스여야 합니다).전자는 최소 문자 수를 지정하고 후자는 10분의 [50]1초 단위의 타임아웃을 지정합니다.4가지 가능성이 있습니다.

c_cc[TIME]그리고.c_cc[MIN]둘 다 제로입니다.
이 경우 버퍼 내의 데이터는 즉시 "읽을 수 있는" 상태가 됩니다.read()는 버퍼에 있는 모든 데이터를 즉시 반환합니다(사용 가능한 데이터가 [51]제로일 경우 0을 반환합니다).
c_cc[TIME]0이 아닌c_cc[MIN]제로
이 경우 버퍼 내의 데이터는 지정된 타임아웃이 경과한 후 "읽기 위해 사용 가능"하며, 이 경우 타이머는 의 시작에 의해 트리거됩니다.read()시스템 콜 또는 단일 문자가 수신된 경우.바꿔 말하면read()는 지정된 최대 합계 시간 동안 대기하며 제로 데이터를 반환할 수 있으며 수신 [51]즉시 모든 데이터를 반환합니다.
c_cc[TIME]0과c_cc[MIN]0이 아니다
이 경우 버퍼 내의 데이터는 지정된 수의 문자가 버퍼로 수신된 후 "읽을 수 있는" 상태가 됩니다.바꿔 말하면read()는 최소한의 데이터량(발신자가 시스템콜로 읽을 준비가 되어 있는 데이터량보다 클 수 있음)을 대기하고, 제로 데이터를 반환하지 않고,[51] 무기한 대기할 수 있습니다.
c_cc[TIME]그리고.c_cc[MIN]둘 다 0이 아닙니다.
이 경우 버퍼 내의 데이터는 지정된 수의 문자가 버퍼로 수신된 후 또는 마지막 문자가 입력된 후 타임아웃이 경과한 후 "읽을 수 있는" 상태가 됩니다.첫 번째 문자에는 타임아웃이 없습니다.바꿔 말하면read()는, 최소한의 데이터량(발신자가 시스템콜로 읽어낼 준비가 되어 있는 것보다 클 가능성이 있다)을 대기하고, 제로 데이터를 반환하지 않고, 무기한으로 대기할 수 있지만,[51] 적어도1 문자의 판독이 버퍼내에 있는 경우는, 지정한 타임 아웃보다 오래 대기하지 않습니다.

출력 처리

출력 처리는 시스템 III/시스템 V의 루트에서 거의 변경되지 않습니다.출력 모드 제어 플래그는 다양한 옵션을 결정합니다.

  • 줄바꿈 문자 앞에 캐리지 리턴을 삽입하여 UNIX 줄바꿈 시멘틱스를 [27][22]많은 단말기가 기대하는 ASCII 시멘틱스로 변환할 수 있습니다.
  • 단말기에는 (텔레타이프라이터 또는 이와 유사한) 캐리지의 물리적인 움직임을 초래할 수 있는 다양한 제어 코드가 주어질 수 있는 시간이 주어질 수 있다(컴퓨터의 관점에서) 백스페이스, 수평 탭, 캐리지 리턴, 폼 피드,[27][52] 라인 피드 등.

메모들

  1. ^ a b c Christian 1988, 11페이지
  2. ^ 1983, 페이지 6
  3. ^ 1991, 페이지 820
  4. ^ 1991년 관, 23-24페이지
  5. ^ Leffler et al. 1989, 페이지 259
  6. ^ a b 1991년 관, 24페이지
  7. ^ Leffler et al. 1989, 37-38페이지
  8. ^ 2008년 Afzal, 페이지 419
  9. ^ 2002년도, 페이지 770
  10. ^ a b 1991년 관, 115페이지
  11. ^ 1991년 관, 372쪽
  12. ^ 1991년 관, 779쪽
  13. ^ 1991, 페이지 751~752.
  14. ^ Leffler et al. 1989, 265페이지
  15. ^ Leffler et al. 1989, 페이지 103
  16. ^ Leffler et al. 1989, 페이지 38
  17. ^ Leffler et al. 1989, 페이지 260~261.
  18. ^ a b c Leffler et al. 1989, 페이지 262
  19. ^ Christian 1988, 395페이지
  20. ^ 1983, 페이지 8
  21. ^ a b 1983, 130-131페이지
  22. ^ a b 1983, 페이지 287
  23. ^ a b Christian 1988, 페이지 26
  24. ^ 1983, 페이지 132~133
  25. ^ Leffler et al. 1989, 페이지 259-260.
  26. ^ a b 1983, 페이지 288
  27. ^ a b c d e f g Leffler et al. 1989, 페이지 260
  28. ^ 1983, 페이지 132
  29. ^ 1983, 페이지 133
  30. ^ Christian 1988, 393페이지
  31. ^ Leffler et al. 1989, 페이지 262~263.
  32. ^ "System III tty(4) man page source". Retrieved October 5, 2012.
  33. ^ a b c 즐로닉 1991, 페이지 157
  34. ^ a b c d 즐로트닉 1991, 페이지 163
  35. ^ 1983, 130페이지
  36. ^ 즐로닉 1991, 페이지 158
  37. ^ 즐로트니크 1991, 페이지 173-174.
  38. ^ 즐로닉 1991, 페이지 162
  39. ^ a b 즐로닉 1991, 페이지 166
  40. ^ 즐로트니크 1991, 페이지 162~163.
  41. ^ 즐로닉 1991, 페이지 164
  42. ^ 즐로닉 1991, 페이지 165
  43. ^ a b c 즐로트니크 1991, 167
  44. ^ a b c d e 즐로닉 1991, 페이지 169
  45. ^ a b c d 즐로닉 1991, 페이지 172
  46. ^ a b 즐로닉 1991, 페이지 174
  47. ^ a b 즐로닉 1991, 페이지 159
  48. ^ 즐로트닉 1991, 페이지 160
  49. ^ a b 즐로트니크 1991, 페이지 160-161.
  50. ^ 즐로트닉 1991, 페이지 161
  51. ^ a b c d 즐로트니크 1991, 페이지 161-162.
  52. ^ 1983, 페이지 287~288

원천

추가 정보