프로세스에 제어 터미널이 있다는 것은 프로세스 자체에 제어 터미널이 있다는 뜻인가요, 아니면 프로세스가 속한 세션에 제어 터미널이 있다는 뜻인가요?
나는 그것이 제어 터미널과의 세션이라고 생각했지만, 다음을 읽었습니다.여기) 이는 제어 터미널을 사용한 프로세스임을 의미합니다.
프로세스의 속성 중 하나는 제어 터미널입니다. 포크를 사용하여 생성된 하위 프로세스는 상위 프로세스의 제어 터미널을 상속합니다. 이런 방식으로 세션의 모든 프로세스는 세션 리더로부터 제어 터미널을 상속받습니다. 제어 터미널의 세션 리더를 해당 터미널의 제어 프로세스라고 합니다.
답변1
실제로 제어 터미널과의 세션입니다.
이것단일 UNIX 사양이 관계를 설명합니다제어 터미널"세션과 연결됨". 계속해서 설명하면 제어 터미널은 세션과 1:1 관계를 갖습니다. 세션은 "최대 하나의 마스터 터미널"과 연결되며 "하나의 마스터 터미널은 정확히 하나의 세션과 연결됩니다".
FreeBSD설계 및 구현이 책에서는 이 문제를 약간 다르게 다루지만 동일한 목표를 달성합니다. 동일한 세션을 공유하는 프로세스는 서로 다른 제어 터미널을 가질 수 없으며 단일 터미널이 동시에 여러 세션의 제어 터미널이 될 수 없습니다.
FreeBSD 내에서 내부적으로 이것이 데이터 구조가 실제로 작동하는 방식입니다. 프로세스 구조에는 pgrp
프로세스가 속한 프로세스 그룹을 나타내는 구조를 가리키는 포인터가 있으며, 이는 프로세스 그룹이 속한 세션을 나타내는 구조를 가리키며 session
, 이는 다시 tty
제어 터미널의 구조 를 가리킵니다. 세션.
Linux 내부에서는 상황이 좀 더 복잡합니다. 각 프로세스에는 프로세스 그룹 ID 및 세션 ID에 대한 구조에 대한 포인터 task_struct
세트가 있으며 각 프로세스 구조에 대한 pid
또 다른 포인터가 있으며 signal_struct
이는 차례로 tty
터미널을 제어하는 구조를 직접 가리킵니다.
추가 읽기
- 조지 V. 네빌-닐, 마샬 커크 맥쿠식, 로버트 N. M. 왓슨(2014-09-25). "공정 관리".FreeBSD 운영 체제의 설계 및 구현. 애디슨-웨슬리 전문가. ISBN 9780133761832.
- 도널드 런(1991). "터미널 입력/출력". POSIX 프로그래머 가이드. 오라일리 미디어 ISBN 9780937175736.
- 다니엘 P. 보베(Daniel P. Bovet)와 마르코 체사티(Marco Cesatti)(2005). "프로세스". Linux 커널 이해: I/O 포트에서 프로세스 관리까지. 세 번째 버전. 오라일리 미디어 ISBN 9780596554910.
- "정의". 오픈 그룹 기본 사양. 이슈 7. 2016. IEEE 1003.1:2008.
- "범용 터미널 인터페이스". 오픈 그룹 기본 사양. 이슈 7. 2016. IEEE 1003.1:2008.
답변2
제가 지식이 부족해서 아래 답변이 틀릴 수도 있습니다
@열쇠::
.tty 확장자를 사용하여 모든 프로세스를 제어 tty(있는 경우)에서 분리할 수 있습니다
TIOCNOTTY ioctl
.기존 어린이는 영향을 받지 않습니다.
=> (@답변::)
대규모로
session_SS
(많은 프로세스 전체로서)controlling_terminal_FF
&연결하다아니면(이제
session_SS
와 관련된 말을 해보세요controlling_terminal_FF
)각 개별 프로세스(내부적으로
session_SS
) 에 대해여전히 반드시 관련이 있는 것은 아닙니다.
controlling_terminal_FF
(예: 분리됨, 제어 터미널 없음)controlling_terminal_FF
( 연결 여부를 선택할 수 있습니다 )- 하지만 옵션은경계하나의 터미널에만 -
controlling_terminal_FF
.
- 하지만 옵션은경계하나의 터미널에만 -
[[그래서 일반적으로 말하는 것처럼 엄격한 "소유/포함" 관계는 없습니다.
"연관/규칙/제약"에 관한 것입니다.
세션은 "소유/연관"될 수 있으며 프로세스는 터미널과 "소유/연관"될 수도 있습니다. 세션은 프로세스가 연관되는 방식을 "제한"합니다.]]
@세부 사항::
많은 프로세스, 프로세스 그룹 및 세션을 생성한다고 가정합니다.
이제 프로세스가 생겼습니다 session_leader_AA
.session_SS
너가 하나 가지고 있네terminal_FF
session_leader_AA
사람 이 안에 있을 때session_SS
연결/열기()terminal_FF
-- terminal_FF
제어 터미널 이 됩니다 session_SS
(그리고 session_leader_AA
제어 프로세스가 됩니다 terminal_FF
).
하위 프로세스상속하다상위 프로세스의 제어 터미널
session_SS
내의 모든 하위 프로세스이미 존재 함session_leader_AA
연결하기 전에terminal_FF
-- 아직 어떤 터미널에도 연결되지 않았습니다.
그 안에 있는 모든 하위 프로세스는 에 연결한 후에 생성
session_SS
되지만session_leader_AA
terminal_FF
자식 프로세스가 아님~의session_leader_AA
-- 아직 어떤 터미널에도 연결되지 않았습니다.
.tty 확장자를 사용하여 모든 프로세스를 제어 tty(있는 경우)에서 분리할 수 있습니다
TIOCNOTTY ioctl
.
@Rule, 참고::
하나의 제어 터미널은 하나의 세션에만 연결할 수 있습니다.
하나의 세션에는 하나의 제어 터미널만 연결할 수 있습니다.
세션의 모든 프로세스는 (단일) 제어 터미널을 가질 수 있습니다
즉, 프로세스에는 제어 터미널이 있고(일부 프로세스에는 제어 터미널이 없음) 프로세스가 소유한 제어 터미널은 동일한 터미널을 참조해야 합니다.
이
ioctl(fd, TIOCNOTTY)
작업은 제어 터미널과 프로세스의 연결을 제거하는 데 사용할 수 있습니다.ioctl(fd, TIOCNOTTY)
( 프로세스에 연결된 제어 터미널이 있는 경우 모든 프로세스에서 호출할 수 있음 )(특히)
session_leader_AA
제어 프로세스가 호출되는 경우controlling_terminal_FF
ioctl(fd, TIOCNOTTY)
다음 단계가 발생합니다.
세션의 모든 프로세스는 제어 터미널과의 연결을 잃습니다.
제어 터미널은 세션과의 연결을 잃습니다.
(따라서 다른 세션 리더가 제어 터미널 +-로 획득할 수 있습니다.)
커널은 SIGHUP 신호(및 SIGCONT 신호)를 보냅니다.
+- 전경 프로세스 그룹의 모든 구성원,
+- 제어 터미널이 없음을 알립니다.
- (프로세스가 종료될 때 발생하는 상황을 제어하는 단계와 동일합니다.)
리눅스 프로그래밍 인터페이스
-
다른 관련 PBS가 있지만 아직 확인된 답변이 없습니다._
따라서 비제어 터미널:_일반 터미널을 파일/터미널 연결로 호출하지만 제어는 아니고 데이터 읽기 전용으로 호출합니다.
분리된 프로세스가 Controlling_Terminal로부터 입력을 받지 않는지 여부(목적)
-
하나
session_leader_AA
에session_SS
연결/열기()terminal_FF
--terminal_FF
제어 터미널이 됩니다session_SS
하위 프로세스상속하다상위 프로세스의 제어 터미널
(세션/)프로세스를 터미널과 연결하는 유일한 두 가지 방법인 것 같습니다.
Foreground_Process_Group의 프로세스도 Controlling_Terminal에서 분리할 수 있는 것 같습니다.