POSIX 사양은 실제로 제어 터미널 과 관련 하여 베팅 을 방지합니다.
- 터미널 제어
- POSIX.1에서는 터미널을 참조하는 여러 특수 파일 중 어떤 것이 가능한지에 대한 질문은 다루지 않습니다. 경로 이름
/dev/tty
은 프로세스와 연관된 제어 터미널의 동의어입니다.
그것은 정의 목록에 있으며, 그게 전부입니다. 그러나 일반 터미널 인터페이스 에서는 다음과 같은 내용이 더 있습니다.
단말기는 제어 단말기로서 프로세스에 속할 수있다. 제어 터미널이있는 세션의 각 프로세스에는 동일한 제어 터미널이 있습니다. 단말기는 최대 하나의 세션 동안 제어 단말기 일 수있다. 세션에 대한 제어 단말기는 구현 정의 방식으로 세션 리더에 의해 할당된다. 세션 리더에 제어 터미널이없고 O_NOCTTY 옵션을 사용하지 않고 세션과 아직 연결되지 않은 터미널 장치 파일을 여는 경우 (open () 참조), 터미널이 세션의 제어 터미널이되는지 여부는 구현 정의됩니다. 리더.
제어 터미널은 fork () 함수 호출 중에 하위 프로세스에 의해 상속됩니다. 프로세스는 새로운 터미널을 생성 할 때 제어 터미널을 포기합니다.setsid()
함수; 제어 터미널로서이 터미널이있는 이전 세션에 남아있는 다른 프로세스는 계속 가지고 있습니다. 제어 터미널과 연관된 시스템 (현재 세션에 있는지 여부)의 마지막 파일 디스크립터가 닫히면 해당 터미널을 제어 터미널로 갖는 모든 프로세스가 제어 터미널을 갖는지 여부는 지정되지 않습니다. 제어 터미널이 이러한 방식으로 양도 된 후 세션 리더가 제어 터미널을 다시 획득 할 수 있는지 여부와 방법은 명시되어 있지 않습니다. 프로세스는 다른 프로세스가 계속 열려있는 경우 제어 터미널과 관련된 모든 파일 설명자를 닫아 제어 터미널을 포기하지 않습니다.
지정되지 않은 부분이 많이 있습니다. 솔직히 말해서 말이됩니다. 터미널은 핵심 사용자 인터페이스이지만 실제 하드웨어 또는 프린터와 같은 경우에는 모든 종류의 다른 것들이지만 많은 경우 xterm
에는 에뮬레이터 와 같은 거의 아무것도 아닙니다. . 터미널을 유닉스보다 많이 사용하기 때문에 어쨌든 유닉스에 관심이 많지 않을 것이라고 생각합니다.
어쨌든 POSIX는 ps
ctty가 관련된 곳 에서 어떻게 행동 해야하는지 꽤 잘 알고 있습니다.
있다 -a
스위치 :
- 터미널과 관련된 모든 프로세스에 대한 정보를 작성하십시오. 구현은이 목록에서 세션 리더를 생략 할 수 있습니다.
큰. 당회 지도자 는 생략 될 수 있다. 그다지 도움이되지 않습니다.
그리고 -t
:
- 용어 목록에 지정된 터미널과 관련된 프로세스에 대한 정보를 작성하십시오. 응용 프로그램은 용어
<blank>
목록이 쉼표로 구분 된 목록 형식의 단일 인수인지 확인해야 합니다. 단말기 식별자는 구현 정의 형식 으로 제공되어야한다 .
... 또 다른 실망입니다. 그러나 XSI 시스템에 대해서는 다음과 같이 말합니다.
- 장치의 파일 이름 (예 : XSI를 준수하는 시스템에서, 그들은 두 가지 형태 중 하나에 따른다
tty04
) 또는 경우에 장치의 파일 이름 시작 tty
, 문자 다음 바로 식별자 tty
(예를 들어 04
) .
그것은 조금 나아지지만 길은 아닙니다. 또한 XSI 시스템에는 다음과 같은 -d
스위치가 있습니다.
- 세션 리더를 제외한 모든 프로세스에 대한 정보를 작성하십시오.
... 적어도 분명합니다. 형식 문자열 -o
과 함께 utput 스위치를 지정할 수 tty
있지만, 앞서 언급했듯이 출력 형식은 구현 정의되어 있습니다. 아직도, 나는 그것이 얻는만큼 좋다고 생각합니다. 많은 작업을 통해 위의 스위치를 다른 유틸리티와 함께 사용하면 꽤 좋은 야구장을 얻을 수 있다고 생각합니다. 그러나 솔직히 말해서, 그것이 언제 / 어떻게 깨어 질지 모르겠습니다. 그리고 그것이 일어날 상황을 상상할 수 없었습니다. 그러나 아마도 우리가 추가 fuser
하고 find
경로를 확인할 수 있다고 생각 합니다.
exec 2<>/dev/null
ctty=$(sh -c 'ps -p "$$" -o tty=' <&2)
sid=$(sh -c 'ps -Ao pid= -o tty=|
grep '"$ctty$"' |
grep -Fv "$(ps -do pid=)"' <&2)
find / -type c -name "*${ctty##*/}*" \
-exec fuser -uv {} \; 2>&1 |
grep ".*$ctty.*${sid%%"$ctty"*}"
/dev/null
물건은 검색 서브 쉘 중 어느 것도 CTTY에 연결 0,1,2의 없었다 때 일할 수있는 것을 보여주기 위해 단지이다. 어쨌든 다음과 같이 인쇄됩니다.
/dev/pts/3: mikeserv 3342 F.... (mikeserv)zsh
위의 내용은 내 컴퓨터의 전체 경로를 얻었으며 대부분의 경우 대부분의 사람들에게 적합하다고 생각합니다. 또한 실패 할 수 있다고 상상할 수 있습니다. 거친 휴리스틱입니다.
이것은 아마도 여러 가지 이유로 실패 할 수 있지만, 세션 리더가 모든 설명자를 ctty에 포기하고 사양이 허용하는대로 sid를 유지하도록 허용하는 시스템을 사용하는 경우 분명히 도움이되지 않습니다. 즉, 나는 이것이 대부분의 경우에 꽤 좋은 추정치를 얻을 수 있다고 생각합니다.
물론 쉬운 일이 당신이 가지고있는 경우 수행 할 어떤 당신의 CTTY에 연결 기술자를 그냥 ...
tty <&2
... 또는 비슷합니다.
ps
솔루션 커버 대부분의 시스템은 (그리고who
더 이상 도움이되지 않습니다ps
가능성 ( "04"와 같은) 혼자 식별자를 처리하기 위해 좀 더 코드). 더 휴대용 솔루션이 있는지 궁금합니다.