전송 제어 규칙 모듈(ldterm)
ldterm 전송 제어 규칙은 터미널에 대한 일반 전송 제어 규칙입니다.
이 전송 제어 규칙은 POSIX를 준수하며 또한 BSD 인터페이스와의 호환성을 보장합니다. 후자의 전송 제어 규칙은 이전 애플리케이션과의 호환성을 위해서만 지원됩니다. 이식성을 위해서는 POSIX 인터페이스를 새 애플리케이션에서 사용하는 것이 좋습니다.
이 절에서는 ldterm 전송 제어 규칙에서 제공되는 기능에 대해 설명합니다. Ldterm 제어에 대한 자세한 내용은 파일 참조의 "termios.h 파일" 을 참조하세요
ldterm 전송 제어 규칙에 대해 학습하려면 다음을 읽으십시오.
터미널 매개 변수
특정 터미널 I/O 특성을 제어하는 파라미터는 ' termios.h ' 파일에 정의된 대로 ' termios ' 구조에 지정됩니다. termios 구조에는 다음 멤버가 포함됩니다(이 멤버로 제한되지 않음).
- tcflag_t c_iflag
- 입력 모드입니다.
- tcflag_t c_oflag
- 출력 모드입니다.
- tcflag_t c_cflag
- 제어 모드입니다.
- tcflag_t c_lflag
- 로컬 모드입니다.
- cc_t c_cc[NCCS]
- 제어 문자입니다.
다음tcflag_t및cc_t부호 없는 정수 유형은 termios.h 파일에 정의되어 있습니다. 또한 NCCS 기호도 termios.h 파일에 정의되어 있습니다.
프로세스 그룹 세션 관리(작업 제어)
제어 터미널은 세션에서 포어그라운드 프로세스 그룹이 될 하나의 프로세스 그룹(제어 터미널과 연관되어 있음)을 구별합니다. 세션의 다른 모든 프로세스 그룹은 백그라운드 프로세스 그룹으로 지정됩니다. 포어그라운드 프로세스 그룹은 신호 처리 시 특수 역할을 수행합니다.
Korn 쉘(ksh 명령) 및 C 쉘(csh 명령)과 같은 작업 제어를 지원하는 명령 해석기 프로세스는 관련 프로세스를 단일 프로세스 그룹에 배치하고 이 프로세스 그룹을 터미널과 연관시켜 서로 다른 작업 또는 프로세스 그룹에 터미널을 할당할 수 있습니다. 권한 요구사항이 충족된 것으로 가정할 때, 터미널의 포어그라운드 프로세스 그룹은 프로세스에 의해 설정되거나 시험될 수 있습니다. 터미널 드라이버는 포어그라운드 프로세스 그룹에 없는 프로세스의 터미널 액세스를 제한하여 작업 할당을 지원합니다.
터미널 액세스 제어
제어 터미널의 포어그라운드 프로세스 그룹에 없는 프로세스가 제어 터미널에서 읽기를 시도할 경우 해당 프로세스의 프로세스 그룹에 SIGTTIN 신호가 전송됩니다. 그러나 읽기 프로세스가 무시되거나 SIGTTIN 신호를 차단하는 경우 또는 읽기 프로세스의 프로세스 그룹이 상위가 없는 경우, 읽기 요청은 -1 값을 리턴하고, errno 글로벌 변수를 EIO로 설정하고 신호를 전송하지 않습니다.
제어 터미널의 포어그라운드 프로세스 그룹에 없는 프로세스가 제어 터미널에 쓰기를 시도할 경우 해당 프로세스의 프로세스 그룹에 SIGTTOU 신호가 전송됩니다. 그러나 SIGTTOU 신호의 관리는 TOSTOP 플래그에 정의되어 있는c_lflag필드에 입력합니다. TOSTOP 플래그가 설정되어 있지 않거나, TOSTOP 플래그가 설정되어 있지만 프로세스가 SIGTTOU 신호를 무시하거나 차단하면 프로세스가 터미널에 기록할 수 있고 SIGTTOU 신호는 전송되지 않습니다. TOSTOP 플래그가 설정되고, 쓰기 프로세스의 프로세스 그룹은 상위가 없어지고, 쓰기 프로세스는 SIGTTOU 신호를 무시하거나 차단하면, 쓰기 요청은 -1 값을 리턴하고 errno 글로벌 변수를 EIO로 설정한 후 신호를 전송하지 않습니다.
터미널 매개변수(tcsetattr, tcsendbreak, tcflow 및 tcflush)를 설정하는 특정 함수는 TOSTOP 플래그를 무시하는 것을 제외하면 쓰기 요청과 같은 방식으로 처리됩니다. 효과는 TOSTOP 플래그가 설정될 때 터미널 쓰기 요청의 효과가 동일합니다.
데이터 읽기 및 입력 처리
터미널 장치 파일이 표준 모드인지, 비표준 모드인지에 따라 두 가지 종류의 입력 처리를 사용할 수 있습니다. 또한 입력 문자는 다음과 같이 처리됩니다c_iflag및c_lflag대해 정보를 입력하십시오. 이와 같은 처리에는 반향 또는 입력 문자를 이를 전송한 터미널로 즉시 전송하는 기능이 포함될 수 있습니다. 반향은 전이중 모드에서 작동할 수 있는 터미널에 유용합니다.
읽기 요청은 O_NONBLOCK 플래그가 open 또는 fcntl 서브루틴에 의해 설정되는지 여부에 따라 두 가지 방식으로 처리될 수 있습니다. O_NONBLOCK 플래그가 설정되지 않으면, 데이터를 사용할 수 있을 때까지 또는 신호를 수신할 때까지 읽기 요청이 차단됩니다. O_NONBLOCK 플래그가 설정되면, 읽기 요청은 다음 세 가지 중 한 가지 방식으로 차단되지 않고 완료됩니다.
- 전체 요청을 충족시키기에 충분한 데이터가 있으면 읽기 요청이 성공적으로 완료되고 읽은 바이트 수를 리턴합니다.
- 전체 요청을 충족시키기에 충분한 데이터가 없으면 최대한 많은 데이터를 읽어서 읽기 요청을 완료하고 읽기 가능한 바이트 수를 리턴합니다.
- 사용 가능한 데이터가 없으면 읽기 요청은 -1 값을 리턴하고 errno 전역 변수를 EAGAIN으로 설정합니다.
데이터의 가용성은 입력 처리 모드가 표준인지 또는 비표준인지에 따라 달라집니다. 표준 또는 비표준 모드는 stty 명령으로 설정될 수 있습니다.
표준 모드 입력 처리
표준 모드 입력 처리에서( c_lflag필드), 터미널 입력은 줄 단위로 처리됩니다. 행은 줄 바꾸기(ASCII LF) 문자, 파일의 끝(EOF) 문자 또는 행의 끝(EOL) 문자로 구분됩니다. 이는 읽기를 시도하는 프로그램이 전체 행을 입력하거나 신호를 수신할 때까지 차단됨을 의미합니다. 또한 읽기 요청에 지정된 문자 수에 상관없이 한 행만 리턴됩니다. 그러나, 전체 행을 한 번에 읽을 필요는 없습니다. 정보를 유실하지 않고 읽기 요청에 문자 수를 지정할 수 있습니다. 입력 중 지우기 및 종료 처리가 수행됩니다.
- ERASE 문자
- (디폴트: 백스페이스) 입력한 마지막 문자를 지웁니다.
- WERASE 문자
- (디폴트: Ctrl-W 키 시퀀스) 현재 행에서 마지막으로 입력한 단어를 지웁니다. 단, 선행 공백이나 탭은 지우지 않습니다.
(단어는 공백이 아닌 문자 시퀀스로 정의되고 탭은 공백으로 간주됩니다.) ERASE 또는 WERASE 문자는 행의 시작 이외에는 지우지 않습니다.
- KILL 문자
- (디폴트: Ctrl-U 시퀀스) 전체 입력 행을 삭제하고, 선택적으로 줄 바꾸기 문자를 출력합니다.
이러한 문자는 모두 사용되었을 수 있는 백스페이스 또는 탭과 관계없이 키 입력을 기준으로 작동합니다.
- REPRINT 문자
- (디폴트: Ctrl-R 시퀀스) 줄 바꾸기 이후에 이전 행의 읽지 않은 문자를 인쇄합니다.
또한 화면에서 정상적으로 지원진 문자가 프로그램 출력에서 지저분하게 인쇄된 경우 자동으로 재인쇄가 이루어집니다. 문자는 반향된 것처럼 다시 인쇄됩니다. 따라서 ECHO 플래그가 설정되어 있지 않은 경우c_lflag필드에 입력하면 문자가 인쇄되지 않습니다. ERASE 및 KILL 문자는 앞에 이스케이프 문자 \(백슬래시)를 입력하여 리터럴로 입력될 수 있습니다. 이 경우 이스케이프 문자는 읽혀지지 않습니다. ERASE, WERASE 및 KILL 문자는 변경될 수 있습니다.
비표준 모드 입력 처리
비정규 모드 입력 처리( -ICANON 플래그가 설정된 경우c_lflag필드), 입력 바이트가 줄로 조립되지 않으며 지우기 및 죽이기 처리가 발생하지 않습니다.
- MIN
- 읽기 요청이 완료될 때 수신해야 할 최소 바이트 수를 나타냅니다.
- 시간
- 분할 및 단기 데이터 전송을 시간종료하는 데 사용되는 0.1초 단위의 타이머입니다.
의 MIN 및 TIME 멤버의 값은c_cc배열은 수신된 바이트의 처리 방법을 결정하는 데 사용됩니다. MIN 및 TIME 값은 stty 명령으로 설정될 수 있습니다. MIN 및 MAX는 0 - 265의 값을 가집니다. MIN 및 TIME에 대한 네 가지 가능한 조합과 그 상호작용은 다음 단락에서 설명합니다.
사례 A: MIN0, TIME0
이 경우, TIME은 첫 번째 바이트를 수신한 후 활성화되고 바이트를 수신할 때마다 재설정되는 인터바이트 타이머로 작동합니다. 인터바이트 타이머가 만료되기 전에 MIN 바이트가 수신되면 읽기 요청이 충족됩니다. MIN 바이트가 수신되기 전에 타이머가 만료되면 해당 위치에 수신된 문자는 사용자에게 리턴됩니다. TIME이 만료되면 최소 1바이트가 리턴됩니다. (바이트를 수신한 경우를 제외하고 타이머는 사용 가능한 상태가 아닙니다.) 읽기 조작은 MIN 및 TIME 메커니즘이 첫 번째 바이트 수신으로 활성화되거나 신호가 수신될 때까지 차단됩니다.
사례 B: MIN0, TIME = 0
이 경우에는 MIN만 중요하고, 타이머는 중요하지 않습니다(TIME 값은 0임). MIN 바이트를 수신하거나 신호를 수신할 때까지 읽기 보유 요청이 충족되지 않습니다(차단됨). 이러한 경우에서 레코드 기반 터미널 입출력을 읽기 위해 사용하는 프로그램은 읽기 조작에서 무기한 차단될 수 있습니다.
사례 C: MIN = 0, TIME0
이 경우에는 MIN 값이 0이므로, TIME은 더 이상 인터바이트 타이머를 나타내지 않습니다. 이 타이머는 이제 읽기 요청이 처리되는 즉시 활성화되는 읽기 타이머로 작동합니다. 읽기 요청은 바이트가 수신되거나 읽기 타이머가 만료되는 즉시 충족됩니다. 타이머가 만료될 경우 바이트가 리턴되지 않음에 유의하십시오. 타이머가 만료되지 않으면 읽기 요청은 바이트를 수신한 경우에만 충족될 수 있습니다. 이런 경우 읽기 조작은 무기한 차단되지 않고 바이트를 기다립니다. 읽기 요청을 초기화한 후 TIME에서 지정된 기간에 0.1초를 곱한 기간 동안 바이트를 수신하지 않으면 읽기 요청은 0 값을 리턴하며 데이트는 읽지 않습니다.
사례 D: MIN = 0, TIME = 0
이 경우, 요청된 바이트 수 또는 현재 사용 가능한 바이트 수 중 최소값이 추가 바이트가 입력될 때까지 대기하지 않고 리턴됩니다. 사용 가능한 문자가 없으면 읽기 요청은 값 0을 리턴하여, 데이터를 읽지 않습니다.
사례 A와 B는 파일 전송 프로그램과 같은 분할 모드 활동을 처리하기 위해 존재하는데, 여기서 프로그램은 최소한 한 번에 MIN 변수로 지정된 문자 수 이상을 처리해야 합니다. 사례 A에서 인터바이트 타이머는 안전 수단으로 활성화됩니다. 사례 B에서 타이머는 꺼져 있습니다.
사례 C와 D는 단일 문자의 제한된 전송을 처리하기 위한 것입니다. 이러한 경우는 화면을 갱신하기 전에 입력 큐에 문자가 있는지 알아야 하는 화면 기반 애플리케이션에 적용될 수 있습니다. 사례 C에서 타이머는 활성화되어 있습니다. 사례 D에서 타이머는 꺼져 있습니다. 사례 D는 과다하게 사용되는 경우 성능의 문제가 발생할 수 있지만, O_NONBLOCK 플래그를 설정하며 읽기 요청을 처리하는 것보다 이를 사용하는 것이 좋습니다.
데이터 쓰기 및 출력 처리
하나 이상의 문자를 기록할 때 이전에 기록된 문자가 표시되는 즉시 이들 문자가 터미널로 전송됩니다. (입력 문자는 도달하는 대로 출력 큐에 삽입되어 반향됩니다.) 프로세스가 문자를 표시할 수 있는 속도보다 더 빨리 문자를 생성할 경우 출력 큐가 특정 한계를 초과하면 프로세스는 일시 중단됩니다. 큐가 특정 임계치에 도달하면 프로그램이 재개됩니다.
모뎀 관리
CLOCAL 플래그가 설정된 경우c_cflag필드에 입력하면 모뎀 상태 termios 상태에 따라 연결이 달라지지 않습니다. CLOCAL 플래그가 지워지면 모뎀 상태 표시줄이 모니터링됩니다. 정상적인 상황에서 open 함수는 모뎀 연결이 완료되기를 기다립니다. 그러나, O_NONBLOCK 또는 CLOCAL 플래그가 설정되어 있으면 open 함수는 연결을 기다리지 않고 즉시 리턴합니다.
CLOCAL 플래그가 설정되어 있지 않은 경우c_cflag필드에서 모뎀 연결 끊김이 제어 터미널의 터미널 인터페이스에 의해 감지되면 터미널과 연결된 제어 프로세스에 SIGHUP 신호가 전송됩니다. 다르게 지정된 경우가 아니면 이 신호는 프로세스를 종료합니다. SIGHUP 신호가 무시되거나 포착되면 후속 읽기 요청은 터미널이 닫힐 때까지 EOF 표시를 리턴합니다. 터미널에 대한 후속 쓰기 요청은 -1 값을 리턴하고 장치가 닫힐 때까지 errno 글로벌 변수를 EIO로 설정합니다.
터미널 장치 파일 닫기
터미널 장치 파일을 닫는 마지막 프로세스를 실행하면 출력은 장치로 전송되고 입력은 버려집니다. 그런 다음 HUPCL 플래그가 설정되어 있으면c_cflag필드에 ' termios ' 구조의 통신 포트가 연결 해제 기능을 지원하면 단말 장치는 연결 해제를 수행합니다.